溫馨提示×

c語言如何查找非重復(fù)子串個數(shù)

小億
91
2024-06-05 13:56:25
欄目: 編程語言

要查找一個字符串中非重復(fù)子串的個數(shù),可以使用一個哈希表來記錄每個字符最后出現(xiàn)的位置,然后使用滑動窗口的方法來遍歷整個字符串。

具體步驟如下:

  1. 初始化一個哈希表,用來記錄每個字符最后出現(xiàn)的位置,初始值為-1。
  2. 定義一個變量count來記錄非重復(fù)子串的個數(shù),初始值為0。
  3. 使用兩個指針i和j來構(gòu)建滑動窗口,初始時i和j均指向字符串的開頭。
  4. 遍歷字符串,將當(dāng)前字符更新到哈希表中,并將j指針向右移動。
  5. 如果當(dāng)前字符在哈希表中的位置大于等于i,說明當(dāng)前字符在滑動窗口中已經(jīng)出現(xiàn)過,需要更新i指針為當(dāng)前字符上一次出現(xiàn)的位置的下一個位置。
  6. 更新count為當(dāng)前滑動窗口的長度。
  7. 返回count作為非重復(fù)子串的個數(shù)。

下面是使用C語言實現(xiàn)的代碼示例:

#include <stdio.h>

int nonRepeatSubstringCount(char* s) {
    int lastPos[128]; // 記錄每個字符最后出現(xiàn)的位置
    int i, j, count;
    
    for (i = 0; i < 128; i++) {
        lastPos[i] = -1;
    }
    
    i = 0;
    j = 0;
    count = 0;
    
    while (s[j] != '\0') {
        if (lastPos[s[j]] >= i) {
            i = lastPos[s[j]] + 1;
        }
        
        lastPos[s[j]] = j;
        
        count += j - i + 1;
        
        j++;
    }
    
    return count;
}

int main() {
    char str[] = "abcabcbb";
    int count = nonRepeatSubstringCount(str);
    
    printf("Non-repeating substring count: %d\n", count);
    
    return 0;
}

以上代碼示例中,非重復(fù)子串的個數(shù)為9,分別為"abc", “bca”, “cab”, “abc”, “bc”, “b”, “ca”, “ab”, “abc”。

0