字符串中的子串数

我的程序应该执行以下操作:

  1. 用户输入一个字符串:科迪勒拉斯大学
  2. 用户输入子字符串:er
  3. 程序输出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 ; 
  1. String是一系列char值(如数组)
  2. 循环遍历此序列和每个char(除了示例中的最后一个):
    1. test,如果 char等于模式的第一个char,并且下一个 char等于模式的第二个char(如果你有不同大小的模式,则适应)
    2. 如果测试结果为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();