算法设计与分析(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.
算法思路:(此算法参考他人的思想)
- 首先建立一个hash table(char, int),每个字符对应一个数值(由于这个例子中我们默认字符都是ASCII的,实际上直接使用每个字符的ASCII值, 没有使用hash table);
- 首先建立一个关于每个字符的索引,全初始化为-1:
vector<int> Indexofchar(256, -1)
,用于记录扫描到当前位置每个字符最近的出现位置; - 给定一个字符串 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;
}