1. 程式人生 > 實用技巧 >Leecode統計子串個數(java)

Leecode統計子串個數(java)

/**

  • 獲取一個字串在另一個字串中出現的次數。判斷str2在str1中出現的次數
    */
public class StringExer2 {
    public static void main(String[] args) {
        String str1 = "ab";
        String str2 = "abaaba";
        getCount(str1, str2);
        System.out.println("子串出現的次數為:" + count);

    }

    /*
     * 如果發現str2中有字元與str1中字元相等,則進入內層迴圈
     *  用str2中每一個字元去和str1的字元比較
     *      如果不相等,結束內層迴圈
     *      如果相等,判斷當前子串索引是否與子串長度-1相等
     *          如相等,則子串已遍歷完,count+=1
     *          如不等,則繼續下一次內層迴圈
     *
     *
     */
    static int getCount(String str1, String str2) {

        str1 = "ab";
        str2 = "aabjkdaaaaafjksdabkjdfsdabj";
        //將字串轉換成字元陣列
        char[] ch1 = str1.toCharArray();
        char[] ch2 = str2.toCharArray();

        int len1 = str1.length();
        int len2 = str2.length();
        int count = 0;//記錄出現次數
        boolean loopFlag = true;//設定一個標識,用於判斷是否找到匹配字元的開關
        for (int i = 0; i < len2; i++) {
            //用比較陣列的首元素進行匹配,一旦匹配到相同的字元,開始後繼的檢測
            if (ch1[0] == ch2[i]) {
                for (int j = 0, k = i; j < len1; j++, k++) {
                    if (k != len2 && ch1[j] == ch2[k]) { // k != len2 是為了應對ab在aba中出現的這種狀況
                        //比較完最後一個字元元素且相同,計數器+1
                        if (j == len1 - 1) {
                            count++;
                            i += len1 - 1;//用於跳過已在匹配的子字串範圍內的長度,-1是為了抵消迴圈的遞增
                            loopFlag = false;
                        }
                    } else
                        break;//一旦發現對應位數不相等,退出檢測
                }
            }
        }
        if (loopFlag) {
            System.out.println("沒有匹配的字串!");
        }
        return count;
    }
}