从字符串末尾截取m和n个字母,然后求圈数得到原始字符串

Cut m and n letters from end of string, then find number of turns to get back original string

问题:给定一个字符串,m和n。

输入1:原始字符串

输入2:m(小于字符串长度):从字符串末尾截取m个字母,然后添加到字符串开头。

输入 3: n (小于字符串长度) : 从上面步骤得到的字符串末尾剪切 n 个字母,然后添加到该字符串的开头。

此过程继续,需要找出返回原始字符串所需的圈数。

def harry(str, m, n):
    le = len(str)
    org = str.upper()
    str = str.upper()
    turn = 0
    for i in str:
        str3 = str[-m:] # last n letters
        str = str.replace(' ', '')[:-m]
        str = str3 + str
        print(str)
        if org != str:
            turn = turn + 1
            str4 = str[-n:]
            str = str.replace(' ', '')[:-n]
            str= str4 + str
            print(str)
            turn = turn + 1
        if org == str:
            break
    print(turn)

str = input("Enter the string")
m=int(input("Enter the value of m"))
n=int(input("Enter the value of n"))
harry(str, m, n)

获得的输出:

Enter the stringarya
Enter the value of m1
Enter the value of n2
AARY
RYAA
ARYA
2

要获得的原始输出:

3 

(需要3轮才能找回原串Arya。)

除了像这样的单词,我正在获取所有单词的输出,尤其是当相同的字母连续出现时。 请帮我解决这个问题。

其实你至少要走一步看看它们是否相等。所以你的回合应该从 1 开始。

参见:https://ide.geeksforgeeks.org/Hw4AWx1O95

def harry(str, m, n):
    le = len(str)
    org = str.upper()
    str = str.upper()
    turn = 1 # <--------Here
    for i in str:
        str3 = str[-m:] # last n letters
        str = str.replace(' ', '')[:-m]
        str = str3 + str
        print(str)
        if org != str:
            turn = turn + 1
            str4 = str[-n:]
            str = str.replace(' ', '')[:-n]
            str= str4 + str
            print(str)
        if org == str:

            break
        turn = turn + 1 #< --------------- Here 

    print(turn)

str = input("Enter the string\n")
m=int(input("Enter the value of m\n"))
n=int(input("Enter the value of n\n"))
harry(str, m, n)
word = input()
m = int(input())
n = int(input())

count = 1
word2 = word[-1*m:] + word[:len(word)-m]

#print("Starting with",word2)

while(word != word2):
    if(count%2 != 0):
        word2 = word2[-1*n:] + word2[:len(word2)-n]
    else:
        word2 = word2[-1*m:] + word2[:len(word2)-m]

    #print("String now", word2)
    count+=1

print(count)

我的方法不同。假设 s、n 和 m 是输入长度,我们必须从字符串 s 的末尾剪切并添加到开头。

解释:假设字符串s为'bcdefghijklmnop',n和m分别为2和3。切割2长度字符串后:opbcdefghijklmn after 3 length lmnopbcdefghijk 并且这个过程一直持续到它形成原始字符串

以上部分大家都知道

结论:字符串的长度必须能被n+m(或*)整除,因为你可以看到 它正在形成这样的系列 n+m+n+m+n+m+.......+ 所以它要么以 n 要么以 m 结尾,即

  1. (length_of_string % (n+m)==0) 如果以m结尾。 --> (n+m)*k

    答案 --> (length_of_string/(n+m))*2
    2 在这里乘以,因为它包括 n 和 m。

    其他

  2. *(length_of_string % (n+m)==n) 如果以n结尾。 --> (n+m)*k + n

    答案 --> (length_of_string/(n+m))*2 + 1

    1 为 n

    额外添加

这是我的代码:

ls = len(input())
n=int(input())
m=int(input())
x=n+m
if(ls%x==0):
    print(ls//x<<1)
elif(ls%x==n):
    print((ls//x<<1)+1)

希望这对您有用。如果没有那么请评论下来。

#include<bits/stdc++.h>

using namespace std;

int findmin(string s ,int m, int n){
    
    int len=s.length();
    int count=1;
    string q=s.substr(len-m,m)+s.substr(0,len-m);
    int cut=n;
    while(q!=s){
        q=q.substr(len-cut,cut)+q.substr(0,len-cut);
        if(cut==m){
            cut=n;
        }
        else{
            cut=m;
        }
        count++;
    }
    return count;
}

int main() {
    int t;
    cin>>t;
    while(t--){
        string s;
        cin>>s;
        int m,n;
        cin>>m>>n;
        cout<<findmin(s,m,n)<<"\n";
    }
}