String 不同的旋转字符串数

String 不同的旋转字符串数,string,algorithm,String,Algorithm,我们有一个字符串S,我们想计算通过旋转字符串可以形成的不同字符串的数量 例如:- S=“aaaa”,这里是一个字符串{“aaaa”} S=“abab”,这里是两个字符串{“abab”,“baba”} 那么,有没有一种算法可以在O(| S |)复杂度下解决这个问题,其中| S |是字符串的长度。类似的东西应该可以解决这个问题 public static int uniqueRotations(String phrase){ Set<String> rotations = new

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

例如:-

S=“aaaa”,这里是一个字符串{“aaaa”}

S=“abab”,这里是两个字符串{“abab”“baba”}


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

类似的东西应该可以解决这个问题

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();
}
publicstaticintuniquerotations(字符串短语){
Set rotations=new HashSet();
增加(短语);
对于(int i=0;i
后缀树,宝贝

如果字符串是S,则为SS构造后缀树(S连接到S)

查找长度为| S |的唯一子字符串的数目。自动获得的唯一性。对于长度| S |,您可能需要稍微更改后缀树算法(以维护深度信息),但这是可行的


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

您可以使用中使用的滚动哈希函数来解决这个问题

您可以使用滚动散列在固定时间内(总共O(| S |)更新大小为| S |的所有子字符串(通过在SS上滑动| S |窗口获得)的散列表


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

您尝试了什么?如果你尝试一下,这似乎是一个相当简单的问题。好吧,我认为有一种方法是旋转字符串并存储在一个集合中形成的不同字符串,答案是集合的大小。我认为可能有一种算法可以使用KMP失败函数。@Corey Ogburn,但复杂性不会是O(| S | ^2)?@CoreyOgburn在每个步骤中检查您是否具有与初始阶段相同的阶段是O(S)复杂度。感谢您的回答,只是问您是否创建此帐户以回答所有后缀树问题:p这绝对不是O(| S |)这似乎比Ukkonen后缀树算法更容易在实际操作中直接编码+在任何情况下,两个答案各有一个答案。