面試時會經常考這樣的題目,估計也不讓使用正則表達式。還好這個算法還算簡單,不過在草稿紙上寫難免會出現運行異常,好吧,面試官贏了,乃們屌絲就實實在在的把代碼碼出來吧。
謝謝“心扉”對我代碼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; } }