LeetCode每日一练(3) Longest Substring Without Repeating Characters C++版

题目

无

解题思路

这个题是一个比较典型的动态规划问题。解题思路大致如下:

以abcbef这个串为例
用一个数据结构pos记录每个元素曾出现的下标,初始为-1
从s[0]开始,pos[‘a’] == -1,说明a还未出现过,令pos[‘a’] = 0,视为将a”加入当前串”,同时长度++
同理令pos[‘b’] = 1,pos[‘c’] = 2
到s[3]时,pos[‘b’] != -1,说明’b’在前面已经出现过了,此时可得到一个不重复串”abc”,刷新当前的最大长度,然后做如下处理:
将pos[s[0~2]]中相应的值更新(不是全部更新) ,亦即将”ab”“移出当前串”,再次计算时将当前长度减去2;

代码

int lengthOfLongestSubstring(string s) {  
        vector<int> dict(256, -1);  
        int maxLen = 0, start = -1;  
        for (int i = 0; i != s.length(); i++) {  
            if (dict[s[i]] > start)  
                start = dict[s[i]];  
            dict[s[i]] = i;  
            maxLen = max(maxLen, i - start);  
        }  
        return maxLen;  
    }  

这里补充几点:

1. 对于这行语句

vector<int> dict(256, -1)  //创建一个256个值的一维动态数组,且初始化值全部为-1

为什么要取256呢?

因为ASCII码表里的字符总共256个,前128个为常用的字符如运算符,字母 ,数字等 键盘上可以显示的后 128个为 特殊字符是键盘上找不到的字符。

2. 对于这个问题

start = dict[s[i]];

数组下标可以是字符吗?

C++数组的下标可以是字符的。

解释如下:
1)C++中字符在计算机内存储的是字符的ASCII码;
2)而ASCII码实质是数字,例如‘a’是97,‘A’是65;
3)如果用字符作为下标,实质就是用该字符的ASCII码作为下标;
4)但是在用字符作为下标时没有数字直观,容易引起数组越界,因此不建议这样用。

C++中的基本数据类型分为两大类:整数和浮点数。其中的字符类型是一种特殊的整数类型,C++要求数组下标必须是整数类型,所以字符也是可以作为下标的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值