[검지 Offer] 가장 긴 중복된 문자가 없는 하위 문자열(동적 기획 + 해시 테이블 업데이트 각 문자가 가장 최근에 나타난 하위 문자열)
제목.
문자열에서 중복된 문자가 포함되지 않은 가장 긴 하위 문자열을 찾아서 가장 긴 문자열의 길이를 계산하십시오.
1:
: "abcabcbb"
: 3
: "abc", 3。
2:
: "bbbbb"
: 1
: "b", 1。
3:
: "pwwkew"
: 3
: "wke", 3。
, ,"pwke" , 。
:
s.length <= 40000
사고의 방향
동적 기획 + 해시 표
시간 복잡도 O (N), 공간 복잡도 O (N): 해시 테이블과 dp 그룹.
class Solution {
public:
int lengthOfLongestSubstring(string s) {
/*
: dp[i] i 。
dp[0]=1, max(dp[0], ... , dp[s.length()-1])。
:
(1)dp[j] = dp[j-1]+1( s[j] , s[j] , i, j-i>dp[j-1]。 i=-1 )
(2) , dp[j]=j-i
,
*/
int size=s.length();
if(size<=1){
return size;
}
int anws = 0;
vector<int> dp(size);
unordered_map<char,int> unmap; //
//
dp[0]=1;
unmap[s[0]] = 0;
//
for(int i=1;i<size;i++){
// : ,
if( unmap.find(s[i]) == unmap.end() ){
dp[i] = dp[i-1] + 1;
}else{
// dp[i-1]
int pos = unmap[s[i]];
// : ,
if( (i-pos) > dp[i-1] ){
dp[i] = dp[i-1] + 1;
}else{
// : ,
dp[i] = i - pos;
}
}
//
unmap[s[i]] = i;
//
if( anws < dp[i] )
anws = dp[i];
}
return anws;
}
};
공간 절약형
매번 dp는 지난번의 값만 사용하기 때문에 우리는 모든 dp를 저장할 필요가 없고 지난번의 값만 저장하면 공간을 절약할 수 있다.cur는 dp[i],pre는 dp[i-1]
시간 복잡도 O(N), 공간 복잡도 O(N): 해시표.
class Solution {
public:
int lengthOfLongestSubstring(string s) {
/*
: dp[i] i 。
dp[0]=1, max(dp[0], ... , dp[s.length()-1])。
:
(1)dp[j] = dp[j-1]+1( s[j] , s[j] , i, j-i>dp[j-1]。 i=-1 )
(2) , dp[j]=j-i
,
dp , dp, ,
*/
int size=s.length();
if(size<=1){
return size;
}
int anws = 0;
unordered_map<char,int> unmap; //
//
int pre,cur;
pre=1;
unmap[s[0]] = 0;
//
for(int i=1;i<size;i++){
// : ,
if( unmap.find(s[i]) == unmap.end() ){
cur = pre + 1;
}else{
// dp[i-1]
int pos = unmap[s[i]];
// : ,
if( (i-pos) > pre ){
cur = pre + 1;
}else{
// : ,
cur = i - pos;
}
}
//
unmap[s[i]] = i;
//
if( anws < cur )
anws = cur;
// pre
pre = cur;
}
return anws;
}
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[검지 Offer] 두 갈래 트리 재구성(전순 시퀀스와 중간 시퀀스, 두 갈래 트리 재구성)두 갈래 나무의 앞 순서와 중간 순서의 결과를 입력하십시오. 이 두 갈래 나무를 다시 만드십시오.입력한 앞 순서와 중간 순서의 결과에 중복된 숫자가 없다고 가정하십시오.예를 들어 앞 순서 반복 시퀀스 {1,2,4,7...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.