所以我是编程新手。我正在使用java。现在我有一个我无法在教授java的网站上解决的任务。
这是作业
编写一个程序,返回另一个字符串中出现的字符串数。
E.g
输入:
第一个字符串:
第二串:学生们正在工程学院努力工作,因为他们喜欢它 输出:
3
注意:您应该只使用嵌套循环。不要使用indexOf或substring等方法。
我enter image description here到达代码计算出现次数但在重复字母的情况下失败
E.g
输入:
First String:ooo
第二个字符串:wooooooooooooooooooooow
输出:21
它应该是7,因为ooo只重复了7次
答案 0 :(得分:0)
在线性时间内使用z-function可以简单地解决这个问题。
int NumberOfcopies(String t, String h){
// t = the first string i.e "ooo"
// h = the second string i.e "wooooooooooooooooooooow"
String s = t + "$" + h; // adding a sentinel character in between
int n = s.length(); // length of new string
int[] z = new int[n]; // z array
// Code ref : http://e-maxx-eng.github.io/string/z-function.html
int l = 0, r = 0;
for (int i = 1; i < n; i++){
if (i <= r)
z[i] = Math.min(r - i + 1, z[i - 1]);
while (i + z[i] < n && s.charAt(z[i]) == s.charAt(i + z[i]))
++z[i];
if (i + z[i] - 1 > r){
l = i;
r = i + z[i] - 1;
}
}
//checking for all the occurance of string t in string h
int res = 0;
for (int i = t.length() + 1; i < n; ){
if (z[i] == t.length()){
//A copy is found so skip next t.length chars
i += t.length();
++res;
}
else ++i;
}
System.out.println("Number of Occurance : " + res);
return res;
}
此字符串的Z函数是长度 n 的数组 第i个元素等于最大字符数 从与第一个重合的位置 i 开始 s的字符。
这可用于在另一个字符串 h 中查找字符串 t 的出现次数。假设我们将字符串t和h加入其间的Sentinel字符(Sentinel字符是在任一字符串中不出现的字符)以形成新字符串 s 。
让我们计算数组z[]
中的z函数。
现在让我们从哨兵角色后面的字符开始搜索,即字符串h的字符。对于字符串h中的第i个字符(如果第i个字符属于字符串s),如果z[i]
等于字符串t的长度(模式),那么它意味着从第i个字符开始,{{ 1}}字符与字符串s的第一个t.length()
字符相同,这是字符串t等于。
例子:
t = ab
h = aaabaab
s = a b $ a a a b a b b
z = 0 0 0 1 1 2 0 1 2 0
i = 0 1 2 3 4 5 6 7 8 9
t.length()
我们可以看到i = 5
,这意味着我们找到了副本。现在为了防止重叠解决方案,我们现在跳过z[i] == t.length()
字符t.length()
继续这将得到你的结果。