我的思路是這樣的:設定一個跑標i,遍歷到strFather.length()-strSub.length(),每一次的遍歷,進行strFather字符串的截取,其中截取的位置為 i -> i+strSub.length()的位置,截取到的字符串strTemp跟strSub進行比較,若相等,則跑標i往後移動 strSub.length() 的位置,並讓次數num 加1 。否則i 往後移動一個位置
代碼如下:
/** * 獲取字符串strSub在 父字符串strFather中出現的次數 * @author zhonglinsen * 2016-3-1 下午 */ public class StringSubStrExistInFatherStr { public static void main(String[] args) { String str="abeefddfadeeabfkkeeabeeabeerfab"; String str1="ab"; String str2="ee"; String str3="f"; System.out.println(getNumSubInFatherStr(str, str1)); System.out.println(getNumSubInFatherStr(str, str2)); System.out.println(getNumSubInFatherStr(str, str3)); } public static int getNumSubInFatherStr(String strFather,String strSub){ System.out.println(strFather); int num=0; int i=0; //注意這裡的遍歷次數: 因為當i置於strFather.length()-strSub.length()時候,如果 //URL:http://www.bianceng.cn/Programming/Java/201608/50384.htm //String strTemp=strFather.substring(i,i+strSub.length() 得到的strTemp仍然不是所匹配的,則不需要再往下 //遍歷了,因為到那個時候若是再執行 strFather.substring(i,i+strSub.length() 就會報異常:下標越界 while(i <= strFather.length()-strSub.length()){ //if (strFather.indexOf(strSub) != -1) { 這樣寫明顯不對 //先進行字符串的截取,再進行equals()匹配,若匹配到了,則跑標往後移動strSub.length()個位置,否則移動一個位置 String strTemp=strFather.substring(i,i+strSub.length()); if (strSub.equals(strTemp)) { //如果找到了一次strSub num 就加一次 同時跑標i往後移動 strSub.length()個位置 num += 1; i += strSub.length(); }else{ //如果找不到strSub 那麼num不變,而跑標i往後移動一個位置 i += 1; } } return num; } }