算法设计与分析(4)-- Longest Substring Without Repeating Characters(难度:Medium)

算法设计与分析(4)

题目:Longest Substring Without Repeating Characters

https://leetcode.com/problems/longest-substring-without-repeating-characters/#/description

问题描述:Given a string, find the length of the longest substring without repeating characters.
算法思路:(此算法参考他人的思想)
  1. 首先建立一个hash table(char, int),每个字符对应一个数值(由于这个例子中我们默认字符都是ASCII的,实际上直接使用每个字符的ASCII值, 没有使用hash table);
  2. 首先建立一个关于每个字符的索引,全初始化为-1:vector<int> Indexofchar(256, -1),用于记录扫描到当前位置每个字符最近的出现位置;
  3. 给定一个字符串 s,从i = 0到i = s.length() 进行处理:
    start表示从 s[start : i] 满足没有重复字符的子串, longest记录最长没有重复字符的子串长度。
    所以第一行取:start = max(Indexofchar[s[i]] + 1, start);
    (注意理解Indexofchar[s[i]] + 1,这个Indexofchar[s[i]] 表示s[i]这个字符最近出现的位置,若没有出现过,它的值为-1;若它曾出现过,为了加入s[i],s[start : i]满足没有重复字符,start应该取max(Indexofchar[s[i]] + 1, start)。)
    第二行:longest = max(longest, i - start + 1); 更新最长的字符串;
    第三行:Indexofchar[s[i]] = i; 更新s[i]这个字符最近出现的位置。
实现代码:
#include<iostream>
#include<cstdio>
#include<vector>

using namespace std;

int max(int x, int y)
{
    return x >= y ? x : y;
}


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

int main()
{
    string s = "121345";
    int len = lengthOfLongestSubstring(s);
    cout << len << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值