Leetcode刷题_03 无重复字符的最长子串(基于C语言)

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官网中有时间复杂度低很多的代码,我还没看,一方面是懒,另一方面是我觉得学习他人的算法或许能学到一些精髓,但是我还是想把这个问题沉淀一下,过段时间再试一下,看一下能否想出耗时更少的算法。
如果代码上存在错误或者问题,麻烦告知,我也是一个菜鸟,大家共同努力,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值