字符串中的子串数
我的程序应该执行以下操作:
- 用户输入一个字符串:科迪勒拉斯大学
- 用户输入子字符串:er
- 程序输出substring-count:2(Cordill er的大学)
我不应该使用.str,而是创建我自己的方法。
天真的方法(检查每个可能索引处的子字符串)在O(nk)中运行,其中n是字符串的长度, k是子字符串的长度。 这可以用for循环实现,类似haystack.substring(i).startsWith(needle)
。
但是存在更有效的算法。 您可能需要查看Knuth-Morris-Pratt算法或Aho-Corasick算法 。 与天真的方法相反,这两种算法在输入方面也表现良好,例如“在10000’X的字符串中查找100’X’的子字符串。
只需替换第一个匹配项并计数直到没有。
int count = 0; while (str.indexOf(subStr)>-1){ str = str.replaceFirst(subStr, ""); count++; } return count ;
- String是一系列
char
值(如数组) - 循环遍历此序列和每个char(除了示例中的最后一个):
- test,如果此 char等于模式的第一个char,并且下一个 char等于模式的第二个char(如果你有不同大小的模式,则适应)
- 如果测试结果为
true
,请递增计数器。
这是基本算法。 如果你已经启动并运行,请考虑特殊情况,例如源字符串为空或比模式更短。
这是我的代码……
import java.util.Scanner; public class occurrenceOf_Substring { public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.println(" Enter a string"); String str=input.nextLine(); System.out.println(" Enter a substring"); String substring=input.nextLine(); int l=substring.length(); int count=0; int index=str.indexOf(substring); // To find first occurrence while(index
算法:
第1步:将mainstring转换为字符数组
第2步:将子字符串转换为字符数组
第3步:逐个字符地比较两个数组
步骤4:如果子串数组中的至少一个字符与mainstring字符数组不匹配,则从子字符串的第一个字符开始,但继续在主字符串中移动
步骤5:如果子串的所有字符都匹配,则递增计数并再次从子串的第一个位置开始。
import java.io.*; import java.util.Scanner; public class SubStringCount { public static void main(String[] args) throws IOException { Scanner input=new Scanner(System.in); System.out.println("Enter you Main string:"); String mainstring=input.nextLine(); System.out.println("Enter the substring"); String substring=input.nextLine(); int i=0;int j=0; char[] str=mainstring.toCharArray(); // converting main string to character array char[] sub=substring.toCharArray(); // converting substring to character array int count=0; while(i
在一行中:
int count = (str.length() - str.replace(subStr, "").length()) / subStr.length();