zoukankan      html  css  js  c++  java
  • Java实现统计某字符串在另一个字符串中出现的次数

    面试时会经常考这样的题目,估计也不让使用正则表达式。还好这个算法还算简单,不过在草稿纸上写难免会出现运行异常,好吧,面试官赢了,乃们屌丝就实实在在的把代码码出来吧。

    谢谢“心扉”对我代码bug的纠正,现已想到更简便的方法,思路就是从被匹配字符串a中一个一个往后推,截取b字符串长度的字符串:

    public class CountHit {
    	public static void main(String[] args) {
    		String a = "123456abcde6a6abc6ab";
    		String b = "6abc";
    		System.out.println(new CountHit().hit(a, b));
    	}
    
    	/**
    	 * 
    	 * @param a
    	 *            被匹配的长字符串
    	 * @param b
    	 *            匹配的短字符串
    	 * @return 匹配次数
    	 */
    	public int hit(String a, String b) {
    		if (a.length() < b.length()) {
    			return 0;
    		}
    		char[] a_t = a.toCharArray();
    		int count = 0;
    
    		for (int i = 0; i < a.length() - b.length(); i++) {
    			StringBuffer buffer = new StringBuffer();
    			for (int j = 0; j < b.length(); j++) {
    				buffer.append(a_t[i + j]);
    			}
    			if(buffer.toString().equals(b)){
    				count ++;
    			}
    		}
    
    		return count;
    	}
    }
    

    下面这个算法有bug,临界点是部分匹配时会导致接下来后续真正能匹配的字符串被跳过一个字符,求高手纠正:

    /**
     * 统计某字符串在另一个字符串中出现的次数
     * 
     * 
     */
    public class CountHit {
    	public static void main(String[] args) {
    		String a = "123456abcde6ab";
    		String b = "6abc";
    		System.out.println(new CountHit().hit(a, b));
    	}
    
    	/**
    	 * 
    	 * @param a
    	 *            被匹配的长字符串
    	 * @param b
    	 *            匹配的短字符串
    	 * @return 匹配次数
    	 */
    	public int hit(String a, String b) {
    		if (a.length() < b.length()) {
    			return 0;
    		}
    		char[] a_t = a.toCharArray();
    		char[] b_t = b.toCharArray();
    		int count = 0, temp = 0, j = 0;
    
    		for (int i = 0; i < a_t.length; i++) {
    			// 保证一个连续的字符串 b 跟 a中某段相匹配
    			if (a_t[i] == b_t[j] && j < b_t.length) {
    				temp++;
    				j++;
    				// 此时连续的字符串 b 跟 已跟 a 中某段相匹配
    				if (temp == b_t.length) {
    					count++;
    					temp = 0;
    					j = 0;
    				}
    			}
    			// 只要有一个字符不匹配,temp计数从来
    			else {
    				temp = 0;
    				j = 0;
    			}
    		}
    
    		return count;
    	}
    }
    
  • 相关阅读:
    tk资料
    jQuery 1.x和jQuery 2.x的最大区别
    活得更像一个人,我的十六年学习之路——北漂18年(44)
    java中的java.util.Map的实现类
    MVC框架的优缺点
    Web Service有关术语的解释
    Java中的字节输入出流和字符输入输出流
    对称加密算法
    怎么让这4个人在17分钟内要过桥
    mysql 只给更新表的某个字段的授权
  • 原文地址:https://www.cnblogs.com/forchase/p/4082443.html
Copyright © 2011-2022 走看看