Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算字符串中的同构循环移位_Java_Algorithm_Scala - Fatal编程技术网

Java 计算字符串中的同构循环移位

Java 计算字符串中的同构循环移位,java,algorithm,scala,Java,Algorithm,Scala,我试图解决一个算法问题,我有一个O(n²)时间,O(n)内存解决方案(见下文),而不是O(n)时间和内存解决方案 问题是计算给定字符串s的同构循环移位数。循环移位是初始字符串的变换,比如if0,我认为你是对的,同构循环移位意味着字符串由重复模式组成 考虑原始字符串的前k个字符,根据循环移位的定义,它们等于原始字符串的第二k个字符 现在,考虑原始字符串的第二个k个字符。这些字符将等于原始字符串的第三个k字符,依此类推,直到您显示该字符串由重复n/k次的k个字符组成 现在的问题是将字符串标识为O(n

我试图解决一个算法问题,我有一个
O(n²)
时间,
O(n)
内存解决方案(见下文),而不是
O(n)
时间和内存解决方案


问题是计算给定字符串s的同构循环移位数。循环移位是初始字符串的变换,比如if
0,我认为你是对的,同构循环移位意味着字符串由重复模式组成

考虑原始字符串的前k个字符,根据循环移位的定义,它们等于原始字符串的第二k个字符

现在,考虑原始字符串的第二个k个字符。这些字符将等于原始字符串的第三个k字符,依此类推,直到您显示该字符串由重复n/k次的k个字符组成

现在的问题是将字符串标识为O(n)中的重复模式

一种方法是使用。failure函数告诉您与位置i匹配的字符串的最长正确前缀。如果在字符串末尾计算失败函数的值,它将告诉您一个数字T,它是与字符串后缀匹配的适当前缀的长度

例如,考虑字符串ABCABCAC。故障功能将是:

-1 0 0 0 1 2 3 4 5 6
所以字符串末尾的值是6,这告诉我们重复模式的长度是p=n-T,在本例中是9-6=3

获得最小重复模式的长度后,只需尝试所有倍数并检查它们是否除以字符串长度:

m=p
count=0
while(m<n)
   if n%m==0: count+=1
   m+=p
m=p
计数=0

虽然(mI)最近再次遇到了类似的问题,唯一的区别是这次字符串由重复模式组成的事实是显式指定的,而不是从规范中推断出来的

我很容易实现了一个Python函数,该函数可以找到字符串中最小重复模式的长度。我在这里添加它,因为if比使用Peter de Rivaz建议的KMP要简单得多,但是他的回答也证明了同构循环移位的存在意味着字符串由重复模式和一旦找到最小的模式,lso就是解决问题的方法

即使是用Python编写的,我相信这段代码也相当容易理解:

def smallestPattern(s)
    (count,res) = (0,1)
    for i,ch in enumerate(s):
        if ch != line[count]:
            count = 0
            res  += 1
        else:
            count += 1
    return res

解释和相关链接对我来说有点复杂,让我花点时间来研究一下!谢谢你详细的回答。对不起,可能有一种更简单的方法来解决这个问题-如果你已经编写了KMP函数,这只是一种非常简单的方法。嗯,我仍然不太明白,但它是有效的。这个问题是我很难及时回答。你也可以在这里使用Z算法,而不是KMPI。我不确定这种方法是否会一直有效,例如,对于00110 00110,它应该检测到一个大小为5的重复模式。@peterderiveaz那是很久以前的事了,我甚至记不起
line
是什么了。我必须在它的broa中找到这段代码der contextI很感兴趣,因为这段代码比我的方法简单得多,我现在也有一个类似的问题要解决。我真的很喜欢你的方法,因为它看起来比KMP函数更容易适应,但当我尝试它时,我无法让它工作。我发现它正在解决的问题()以及完整的代码()。现在我可以在time@PeterdeRivaz代码被窃听了,它不能处理所有的边缘情况。我可以看到我当时的想法。我会努力让它工作。
m=p
count=0
while(m<n)
   if n%m==0: count+=1
   m+=p
def smallestPattern(s)
    (count,res) = (0,1)
    for i,ch in enumerate(s):
        if ch != line[count]:
            count = 0
            res  += 1
        else:
            count += 1
    return res