在字符串中找到一個連續子字符串,沒有重復並且長度最長


如題

給定一個全小寫的英文字符串,請在該字符串中找到一個連續子字符串,使得子字符串沒有重復的字符並且長度最長,計算此最長字符串的長度。比如:abcbdeab,最長的子字符串為cbdea,長度為5;aaaa,最長子字串為a,長度為1。

 

基本思想

例如:給定字符串abcabcdabc,首先從a開始,然后一直向后查找,當字符為b時,查找b是否與前面的字符相同,結果為不相同,即繼續向后查找。當字符第二次為a時,判定該字符與前面的字符相同,記錄子串長度,然后重新從與該字符相同的字符的后一位重新開始,即第一個字符a的后一位b開始,。直到給定字符串遍歷結束,記錄子字符串最大的長度。

 

Input:
2         //輸入的第一行指定用例數量T
abcabcdabc  //輸入小寫字符串

bbbb

Output:

4
1

#include <stdio.h>
#include <string.h>

int find_max_len_sub_string(const char* str)
{
    int index=0,count=0;   //定義字符串下標,不重復的子串開始下標
    int len_max = 0;      //定義子串最大長度
    int len = strlen(str);    //獲取字符串長度
    while(index<len)
    {
        for(int i=count; i<index; i++)    //在已經確定未重復的字符序列中查找是否有與當前字符相同的字符
        {
            if(str[i] == str[index])     //找到重復字符
            {
                index = index-count;    //當前未重復字符串的長度
                len_max = index>len_max? index:len_max;
                index = i;   //字符串下標回退
                count = i+1;   //新的子串開始下標

            }
        }
        index++; 
    }
    if(len_max == 0)  len_max=len;  //遍歷結束,未找到重復字符,最大長度即為字符串長度
    return len_max;
}

int main()
{
    int t;    //指定用例數量
    scanf("%d",&t);
    while(t--)
    {
        char str[100]={};
        scanf("%s",str);
        int len = find_max_len_sub_string(str);
        printf("%d\n",len);   //輸出最大長度
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM