黑马程序员技术交流社区

标题: 在一个长字符串中,统计一个子字符串出现的次数 [打印本页]

作者: joerk    时间: 2015-7-20 22:47
标题: 在一个长字符串中,统计一个子字符串出现的次数
  1. package com.vincent.day_12;
  2. /*
  3. * 2015年7月18日17:53:34
  4. * 此类的功能是:在一个长字符串中查找一个子串出现的次数?
  5. *
  6. */
  7. public class SubStringCount {
  8.         public static void main(String[] args) {
  9.                 String s = "foanangjoiajnananjoinananjgnananoi";
  10.                 String sub = "nan";

  11.                 SubStringCount ssc = new SubStringCount();
  12.                 int indexCount = ssc.CountSubstring(s, sub);
  13.                 System.out.println(indexCount);
  14.         }

  15.         public int CountSubstring(String s, String sub) {
  16.                 int count = 0;
  17.                 int index = 0;//记录每次查找到的第一个子串的索引值

  18.                 for (int i = 0; i <= (s.length() - (s.length() % sub.length())); i++) {//i <= (s.length() - (s.length() % sub.length()))这个是判断每一次的父串是否小于子串;
  19.                         s = s.substring(i);//每次找到子串后,切割父串中子串  “索引值+1”(这个“+1”动作在for循环中完成的)  的前面部分,而生成一个新的父串
  20.                         if ((index = s.indexOf(sub)) != -1) {
  21.                                 count++;
  22.                                 i = index;
  23.                         } else{
  24.                                 return count;// 不存在子串
  25.                         }
  26.                 }
  27.                 return count;
  28.         }
  29. }
复制代码

如果有更好的算法,望大家不吝分享。。。有修改建议的也望踊跃提出。。。。{:3_53:}
作者: 我本灬无名    时间: 2015-7-20 23:21
不用切串,你只要把每次查找的索引加上小串的长度,再次查找就行,更简单,但是难理解。
作者: xyxlx111    时间: 2015-7-20 23:22
写的不错,顶一个
作者: 时光无痕    时间: 2015-7-20 23:23
写的不错
作者: joerk    时间: 2015-7-20 23:30
我本灬无名 发表于 2015-7-20 23:21
不用切串,你只要把每次查找的索引加上小串的长度,再次查找就行,更简单,但是难理解。 ...

第22句,不要,在第23句中用 (index = s.indexOf(sub,index)) != -1.是这样吧,刚看到,你这样说,我也知道有这种方法,就没测试了,不知道这样改能对吗,明天再测试一下
作者: 鹰隼展翼    时间: 2015-7-20 23:33
写的不错赞一个
作者: kkkkkccccc    时间: 2015-7-20 23:42
写的很细心.666
作者: 我本灬无名    时间: 2015-7-21 00:04
joerk 发表于 2015-7-20 23:30
第22句,不要,在第23句中用 (index = s.indexOf(sub,index)) != -1.是这样吧,刚看到,你这样说,我也知 ...

对,每次重新获取一遍新的索引
作者: joerk    时间: 2015-7-21 21:47
我本灬无名 发表于 2015-7-21 00:04
对,每次重新获取一遍新的索引

今天测试了,22和25行注释掉,23行的改成:if((index = s.indexOf(sub , index+1)) != -1),就可以了
作者: spike_az    时间: 2015-7-21 22:03
学习了
作者: joerk    时间: 2015-7-23 21:25
今天发现,还是有点瑕疵啊,第二种这样改感觉比较nice吧。。。。
  1. public int CountSubstring_2(String s, String sub) {
  2.                 int count = 0;
  3.                 int index = 0;//记录每次查找到的第一个子串的索引值

  4.                 while(sub.length()<=s.length()-index) {//判断每次取index后的,从index位置起到父串末尾的的长度大于等于子串。
  5.                         if ((index = s.indexOf(sub,index+1)) != -1) {
  6.                                 count++;
  7.                         } else{
  8.                                 return count;// 不存在子串
  9.                         }
  10.                 }
  11.                 return count;
  12.         }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2