给定一个字符串s,找出其中不包含重复字符的最长子串的长度。
例如字符串abcabcd
子串分为abc abcd
abcd的长度最长。
思路:将一个字符串分为多个子串,用二维数组存储起来,最后利用strlen()获取子串长度,超出最长子串。
第一阶段:将字符串分为多个子串。
可以用二维数组来存储子串,暂用 int i来当子串的下标。
利用for循环来更换子串:for (int i = 0; i >= 0; i++)
第二阶段:如果把输入的字符串放入子串内。
根据题目条件,它不允许子串中有重复字符,
因此我们可以对字符串的每一个字符进行判断,
通过循环判断:如果子串里没有字符串的字符相同的字符,那么就将他加入子串,否则就终止循环,切换下一个子串。
int x = 1;判断值 int b = 0;//子串的存储下标每个子串都是从0下标存储的 while (x) {第一次循环用于遍历字符串的值, int a = 0;//a的值是下标1,用于第二次判断字符串的字符是否与子串里的每一个字符相等 while (a <= strlen(cc[i]))strlen(cc[i])是指每个子串的长度,此处的while()用于字符串的子串跟子串里的每一个字符进行比较 {//判断是否添加 if (t[j] == cc[i][a]) { x = 0; break;如果字符串的字符跟子串的字符相等,直接退出,进入第二个子串里 } else if (t[j] == '\0')用于字符串的最后一个字符,如果满足条件,全部循环都将终止。 { x = 0; i = -2;控制for() break; } a++; } if (x)如果字符串的字符跟子串里的每一个字符都不相符,就把字符赋值到子串中 { cc[i][b] = t[j]; b++; j++; } else x = 0; }
第三阶段:比较每个子串的长度,找出最大值。
利用strlen()
int a=0;
int i=0;
while(1){
if(i<strlen(cc[i])
i=strlen(cc[i]);
else if(strlen(cc[i])==0)
break;
i++
}
整体代码
#include<stdio.h> #include<string.h> void main() { char cc[100][100] = { 0 }, t[100] = { 0 }; int j = 0;//输入的字符串的下标 scanf("%s", t); for (int i = 0; i >= 0; i++) {//分数组 int x = 1; int b = 0;//存储下标 while (x) {//添加元素,便利出入字符串的元素 int a = 0;//比较字符的下标 while (a <= strlen(cc[i])) {//判断是否添加,通过与二维的一维数组比较 if (t[j] == cc[i][a]) { x = 0; break; } else if (t[j] == '\0') { x = 0; i = -2; break; } a++; } if (x) { cc[i][b] = t[j]; b++; j++; } else x = 0; } } int q = 0; int max = 0; while (1) { if (max < strlen(cc[q])) { max = strlen(cc[q]); } else if (strlen(cc[q]) == 0) break; q++; } printf(" %d", max); }
标签:子串,字符,下标,int,while,字符串,最长 From: https://www.cnblogs.com/tkmi/p/18119970