eg:在一段字符串中找到不重复的最大字符,输出其长度!
如:acbbbbhjgu 最大长度的字符串为bhjgu,长度为5
C语言
#include<stdio.h>
#include<string.h>
#define SIZE 10
int main(void)
{
//输入一个目标字符串
char a[SIZE] = {0};
scanf("请输入一个字符串%s", &a);
//创建一个数组b用于接收子字符串长度
int b[SIZE] = {0};
int i = j = k = 0;
for(i = 0 ; a[i] ; i++)
{
//子字符串最短为一个字母,所以初始化b[i]=1 。每进行完一次循环没有break说明当前字符的前面没有与之相等的,b[i]++
for(b[i] = 1, j = i + 1 ; a[j] ; j++ , b[i]++)
{
// 当前字符为第k个,从第i个字符开始往后比较
for(k = i ; k < j ; k++)
{
if(a[k] == a[j])
{
break;//如果相等,则退出循环
}
}
if(k<j)
{
break; //k<j说明上面个循环没有进行完(break了),所以就遇到了相等的字符,则以第i个字符开头的子字符串到达了最长,返回最外层循环
}
}
}
int max=b[0];
for(i = 0 ; i<strlen(a) ; i++){
if(b[i] > max)
max = b[i];
}
printf("%d\n",max);
return 0;
}
Python:
def no_repeat_str(s):
'''找出来一个字符串中最长不重复子串'''
res_list = []
length = len(s)
for i in range(length):
tmp = s[i]
for j in range(i + 1, length): # 遍历,不存在则拼接,已存在则打断循环
if s[j] not in tmp:
tmp += s[j]
else:
break
res_list.append(tmp) # 构造子串列表
# 以下代码目的是取子串列表中长度最大的元素,方法很多,以下是两种思路:
# 方法一(冒泡排序):
for i in range(len(res_list) - 1):
for j in range(len(res_list) - i - 1):
if len(res_list[j]) > len(res_list[j + 1]):
res_list[j], res_list[j + 1] = res_list[j + 1], res_list[j]
"""
# 方法二(选择排序):
for i in range(len(res_list)):
k = i
j = i + 1
while j < len(res_list):
if len(res_list[k]) > len(res_list[j]):
k = j
j += 1
if i != k:
res_list[i], res_list[k] = res_list[k], res_list[i]
"""
return res_list[-1]
if __name__ == '__main__':
str_list = ['5432467843', 'fdsaefkjkgdok', 'jhrd123xfdsa8042d5439']
for s in str_list:
res = no_repeat_str(s)
print('%s最长非重复子串为:%s,长度为: %s' % (s, res, len(res)))