如題
給定一個全小寫的英文字符串,請在該字符串中找到一個連續子字符串,使得子字符串沒有重復的字符並且長度最長,計算此最長字符串的長度。比如: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); //輸出最大長度 } }