统计一个字符串包含另一个字符串的个数

例如:
s1=“ababa”
s2=“aba”
s1中包含s2中子串的个数为2。

第一种做法:
就是直接循环遍历s1,每次在s1中裁剪s2长度的字符与s2比较,这种方式缺点是每次计数加1,效率太低。
调用String 的indexOf可以统计出s2的初始位置,并且可以指定开始位置,可是开始位置如果每次加s2串的长度,如上,那么结果就是1,显然不对。调用这个方法就不能每次+1了,关键是下次的初始位置是什么?

第二种方式:
看s2字符串的规律,aba,abcab,前一部分与后一部分已经相等了,那么只要上次abcab匹配了,计数量,只要加上重复的个数就行了。

import java.util.Scanner;
import java.util.Stack;

import  java.util.*;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner cn = new Scanner(System.in);
        
        String s = "aabaabaab";
        String s2 = "aabaa";
        int len = test(s2);
        int index = 0,count=0;
        //每次调用完indexOf方法后,下次起始位置就是上次的起始位置+子串的重复长度
        while(s.indexOf(s2,index)!=-1) {
        	index +=len;
        	count++;
        }
        System.out.println(count);
    }  
    //统计子串前缀与后缀重复的部分,返回最大重复长度+1,表示下次再主串中的起始位置
    public static int test(String str) {
    	int i = 1;
    	int j = str.length() -i;
    	int len = 0;
    	while(i<=j) {
    		String s1 = str.substring(0,i);
    		String s2 = str.substring(j,str.length());
    		if(s1.equals(s2)) {
    			len = Math.max(len, i);
    		}
    		
    		i++;
    		j=str.length()-i;
    	}
    	if(len ==0) return str.length();
    	else return str.length()-len;
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值