不同旋转字符串的数量

时间:2013-12-11 18:11:05

标签: string algorithm

我们有一个字符串 S ,我们想要计算通过旋转字符串可以形成的不同字符串的数量。

例如: -

S =“aaaa”,此处为1字符串{“aaaa”}

S =“abab”,这里有2个字符串{“abab”“baba”}

那么,有没有一种算法可以在O(| S |)复杂度中解决这个问题,其中| S |是字符串的长度。

3 个答案:

答案 0 :(得分:5)

后缀树,宝贝!

如果string是S.构造SS的后缀树(S连接到S)。

查找长度为| S |的唯一子串的数量。您自动获得的独特性。长度| S |你可能需要稍微更改后缀树算法(以保持深度信息),但是可行。

(请注意,johnsoe的另一个答案实际上是二次的,或者更糟,取决于Set的实现。)

答案 1 :(得分:2)

您可以使用Rabin-Karp algorithm中使用的滚动哈希函数来解决此问题。

您可以使用滚动哈希来更新大小为| S |的所有子字符串的哈希表(通过在SS上滑动| S |窗口获得)在恒定时间内(因此,总共O(| S |))。

假设您的字符串来自常量字母表,您可以在恒定时间内检查哈希表以获得所需的指标。

答案 2 :(得分:1)

这样的事情应该可以解决问题。

public static int uniqueRotations(String phrase){
    Set<String> rotations = new HashSet<String>();
    rotations.add(phrase);
    for(int i = 0; i < phrase.length() - 1; i++){
        phrase = phrase.charAt(phrase.length() - 1) + phrase.substring(0, phrase.length() - 1); 
        rotations.add(phrase);
    }
    return rotations.size();
}
相关问题