Leetcode_03题目
给定一个字符串s,请找出其中不含有重复字符的最长子串的长度。以下为示例。
Example 1
input: s = "abcabcbb"
output: 3
explanation: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
Example 2
input: s = "bbbbb"
output: 1
explanation: 因为无重复字符的最长子串是 "b",所以其长度为 1。
Example 3
input: s = "pwwkew"
output: 3
explanation: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
Example 4
input: s = ""
output: 0
个人解答及思路
int lengthOfLongestSubstring(char * s){
int count = 0;
int max = 0;
while (s[count] != '\0'){
// 此处9999并不恰当,因为每一次进入循环都会分配9999字节的连续内存空间
// 容易造成空间冗余,可将其更换为链表,灵活性更好
char str[9999] = {s[count]};
int num = 1;
int flag = 1;
while (s[count+num] != '\0' && flag){
// 遍历之前的每一位
for (int i = 0; i < num; i++){
flag = flag && (s[count+num] ^ str[i]);
}
if (flag){
str[num] = s[count+num];
num++;
}
}
max = (max<num)?num:max;
count++;
}
return max;
}
思路:
本题是对所给字符串进行非重复最大子串的长度分析,换种说话就是根据所给的字符串找出
一个子串,该子串的特征:内部所有字母各不相同,所有符合要求的子串中最长的子串长度即为
输出数据。
所以一开始想到的就是通过索引来逐个判断,由于未采用字符串的部分函数(学过但是忘了)
故此处采用笨办法将每一位进行分析,利用count来进行字符串的索引,然后基于每一位,向后排
查字符,直到找出与之相同的字符截止。此时需要注意:通过两个相同字符之间寻找子串时需要
注意子串内部不能有重复的字符,故在遍历后续字符的时候需要直接检索前方的所有字母判断是
否重复,此处采用一种简单的判断方法:通过异或位运算符来实现判断标志变量flag的信息获取
代码调整:
由于在进行代码注释过程中注意到可以不需要初始创建str字符串存储,可直接对s字符串进
行索引分析,故此处进行修改得到如下代码。
int lengthOfLongestSubstring(char * s){
int count = 0;
int max = 0;
while (s[count] != '\0'){
int num = 1;
int flag = 1;
while (s[count+num] != '\0' && flag){
for (int i = 0; i < num; i++){
flag = flag && (s[count+num] ^ s[count+i]);
}
if (flag) num++;
}
max = (max<num)?num:max;
count++;
}
return max;
}
题目总结
关于本题,理解起来并不难主要是将题目中的要求进行拆分,分析得出相应的解题思路,不同于做题,算法繁多,如何在诸多算法中找到一个时空复杂度较低的算法,这是需要时间的磨练,以及及时的反思。我知道我这个方法并不是最佳的,Leetcode官网中有时间复杂度低很多的代码,我还没看,一方面是懒,另一方面是我觉得学习他人的算法或许能学到一些精髓,但是我还是想把这个问题沉淀一下,过段时间再试一下,看一下能否想出耗时更少的算法。
如果代码上存在错误或者问题,麻烦告知,我也是一个菜鸟,大家共同努力,谢谢。