从旋转的字符串中查找原始字符串所需的旋转次数计数的另一种方法

时间:2019-04-30 15:09:11

标签: java algorithm

我们有2个字符串,一个正确,另一个旋转?我们必须告诉我们,在第二根弦旋转了几步之后,我们得到了原始的(第一根)弦(假设只允许一侧旋转)

但是这里的问题是传统的方法,一次旋转一个字符串的一个字符,然后将旋转的字符串与原始字符进行比较会花费比允许的更多的时间 可以使用哪种替代方法?

字符串1:david 字符串2:vidda

(首先处理零件旋转:avidd,其次处理david,所以答案是2) 输出:2

2 个答案:

答案 0 :(得分:3)

String one = "david"; 
String two = "vidda";

one.concat(one).indexOf(two) 

行不行?

答案 1 :(得分:0)

我不知道我的方法是否足够快...但是它的运行时长为O(n),其中n是字符串的长度。

这种方法仅在可以解决且两个字符串长度相同的情况下才有效:

public static void main(String[] args) {
    String string1 = "david";
    String string2 = "avidd";
    char[] a = string1.toCharArray();
    char[] b = string2.toCharArray();
    int pointer = a.length-1;
    int off = 0;
    int current = 0;
    for (int i = b.length-1; i >= 0; i--) {
        if (b[i] == a[pointer]) {   //found a match
            current++;              //our current match is one higher
            pointer--;              //pointer of string1 goes one back
        } else if (current != 0) {  //no match anymore and we have had a match
            i ++;                   //we have to recalculate the actual position in the next step of the loop
            off += current;         //we have to rotate `current` times more
            current = 0;            //reset current match
            pointer = a.length-1;   //reset pointer
        } else {                    //no match and we didn't have had a match the last time
            off ++;                 //we have to rotate one more time
        }
    }
    System.out.println("Rotate: " + off);
}

基本上,它从两个字符串的末尾开始,一直返回到开始,直到不再有任何区别为止。如果它确实在任何时候有所不同,则会将当前计数器添加到off并在string1的末尾继续。

我的算法不会执行off旋转后检查字符串是否相同。