我使用naive方法实现了字符串搜索算法,以计算子字符串在字符串中出现的次数。我在javascript和python中完成了实现。
算法(来自Topcoder):
function brute_force(text[], pattern[])
{
// let n be the size of the text and m the size of the
// pattern
count = 0
for(i = 0; i < n; i++) {
for(j = 0; j < m && i + j < n; j++)
if(text[i + j] != pattern[j]) break;
// mismatch found, break the inner loop
if(j == m) // match found
count+=1
return count
}
}
Javascript实施:
a = "Rainbow";
b = "Rain";
count = 0;
function findSubStr(Str, SubStr){
for (i = 0; i<a.length; i++){
//document.write(i, '<br/>');
for (j = 0; j < b.length; j++)
//document.write('i = ',i, '<br/>');
//document.write(j, '<br/>');
if(a[i + j] != b[j]) break;
document.write('j = ', j, '<br/>')
//document.write('i = ',i, '<br/>');
if (j == b.length)
count+=1;
}
return count;
}
document.write("Count is ",findSubStr(a,b), '<br/>');
Python实现:
a = "Rainbow"
b = "Rain"
def SubStrInStr(Str, SubStr):
count = 0
for i in range(len(Str)):
for j in range(len(SubStr)):
print j
if (a[i + j] != b[j]):
break
if (j+1 == len(SubStr)):
count+=1
return count
print(SubStrInStr(a, b))
现在我的问题是实现if(j == b.length
)的行:它在javascript中工作得很好但是对于python我需要在j
的值中加1或从长度中扣除1 b
。我不知道为什么会这样。
答案 0 :(得分:3)
for x in range(4)
与Python中的Javascript不同,for循环用于列表中的每个元素。最后一个值x将是列表[0,1,2,3]的最后一个元素,即3。
for(x = 0; x < 4; x++)
在Javascript中,x取4的值,循环结束,因为x&lt; 4条件不再适用。最后一个值x将为4。
答案 1 :(得分:1)
你有这种困惑,因为你的代码不一样。执行public object Property { get; set; }
for (j = 0; j < b.length; j++)
的最终值将为j
(如果b是a的子字符串),但对于Python,情况稍有不同。运行b.length
会产生range(len("1234"))
,因此您的[0, 1, 2, 3]
更像是for
,foreach
存储数组中的最后一个值,这就是为什么你必须添加一个。我希望我足够清楚。如果没有,请询问详情。
答案 2 :(得分:0)
我对 javascript 一无所知,但我已经用最简单的方法在所有情况下实现了 Python 中的朴素搜索。
如下图所示。 它将返回没有找到的时间模式。
def naive_pattern_search(data,search):
n = len(data) #Finding length of data
m = len(search) #Finding length of pattern to be searched.
i = 0
count = c = 0 #Taking for counting pattern if exixts.
for j in range(m-1):#Loop continue till length of pattern to be Search.
while i <= (n-1):#Data loop
#if searched patten length reached highest index at that time again initilize with 0.
if j > (m-1):
j = 0
#Data and search have same element then both Index increment by 1.
if data[i]==search[j]:
#print(f"\n{ data[i] } { search[j] }")
#print(f"i : {i} {data[i]} j : {j} {search[j]}")
i+=1
j+=1
count+=1
#If one pattern compared and found Successfully then Its Counter for pattern.
if count== (m-1):
c = c + 1
#Initilise pattern again with 0 for searching with next element in data.
else:
j = 0 #Direct move to 0th index.
i+=1
count=0 #If data not found as per pattern continuously then it will start counting from 0 again.
#Searched pattern occurs more then 0 then its Simply means that pattern found.
if c > 0:
return c;
else:
return -1;
输入:abcabcabcabcabc 输出:发现模式:5次
答案 3 :(得分:-1)
我发现你的python实现有一些问题。如果设置b =“raiy”,则函数将错误地返回1.您可能会误解边缘条件。 这两个条件陈述应该在同一级别。
a = "Rainbow"
b = "Rain"
def SubStrInStr(Str, SubStr):
count = 0
for i in range(len(Str)):
for j in range(len(SubStr)):
# print (j)
if (a[i + j] != b[j]):
break
if (j+1 == len(SubStr)):
count+=1
return count
print(SubStrInStr(a, b))here