我们有一个字符串 S ,我们想要计算通过旋转字符串可以形成的不同字符串的数量。
例如: -
S =“aaaa”,此处为1字符串{“aaaa”}
S =“abab”,这里有2个字符串{“abab”,“baba”}
那么,有没有一种算法可以在O(| S |)复杂度中解决这个问题,其中| S |是字符串的长度。
答案 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();
}