哈希 table 与字符串检查
Hash table with string check
我正在编写一些代码来检查字符串中字符的重复。这是我在某处找到的一些答案。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int hash[256];
for(int i=0; i<256; i++) hash[i] = -1;
int start = 0, ans = 0;
int i;
for(i=0; i<s.size(); i++){
if( -1 != hash[ s[i] ] ){
if(ans < i-start) ans = i-start;//update max length
for(int j=start; j<hash[ s[i] ]; j++) hash[j] = -1;
if(hash[ s[i] ] + 1 > start )
start = hash[ s[i] ] +1;//update start if repeat happen
}
hash[ s[i]] = i;
}
if(ans < i-start) ans = i-start;
return ans;
}
};
有效,大部分地方都清楚了。我只是对几行感到困惑。
if( -1 != hash[ s[i] ] ){
if(ans < i-start) ans = i-start;//update max length
for(int j=start; j<hash[ s[i] ]; j++) hash[j] = -1;
if(hash[ s[i] ] + 1 > start )
start = hash[ s[i] ] +1;
}
hash[ s[i]] = i;
这里有问题:
(1) 为什么要检查 hash[s[i]]!=-1? s[i]是字符串中的字符,上面代码显示hash[i],i是从0-256.
(2) 我很困惑
for(int j=start; j<hash[ s[i] ]; j++) hash[j] = -1;
if(hash[ s[i] ] + 1 > start )
start = hash[ s[i] ] +1;
请问它在做什么?
那不是哈希表。 hash
变量是一个 int 数组,由字符串中 char 的 ascii 代码索引,因此 hash[s[i]] 其中 s[i]=='A' 是 hash[63] .所以,它所做的是将字符的位置存储在由字符代码索引的数组中。
hash[s[i]]!=-1
检查是否出现字符
for(int j=start; j 从 start 到字符集 hash[position] 的当前位置为 -1。这一定是错误的或错误的,因为它混合了基于字符的具有 j.</p> 位置性质的哈希索引
<p> if(hash[ s[i] ] + 1 > start ) start = hash[ s[i] ] +1;
如果当前字符的位置在start之后,则在当前字符之后设置start。
我正在编写一些代码来检查字符串中字符的重复。这是我在某处找到的一些答案。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int hash[256];
for(int i=0; i<256; i++) hash[i] = -1;
int start = 0, ans = 0;
int i;
for(i=0; i<s.size(); i++){
if( -1 != hash[ s[i] ] ){
if(ans < i-start) ans = i-start;//update max length
for(int j=start; j<hash[ s[i] ]; j++) hash[j] = -1;
if(hash[ s[i] ] + 1 > start )
start = hash[ s[i] ] +1;//update start if repeat happen
}
hash[ s[i]] = i;
}
if(ans < i-start) ans = i-start;
return ans;
}
};
有效,大部分地方都清楚了。我只是对几行感到困惑。
if( -1 != hash[ s[i] ] ){
if(ans < i-start) ans = i-start;//update max length
for(int j=start; j<hash[ s[i] ]; j++) hash[j] = -1;
if(hash[ s[i] ] + 1 > start )
start = hash[ s[i] ] +1;
}
hash[ s[i]] = i;
这里有问题:
(1) 为什么要检查 hash[s[i]]!=-1? s[i]是字符串中的字符,上面代码显示hash[i],i是从0-256.
(2) 我很困惑
for(int j=start; j<hash[ s[i] ]; j++) hash[j] = -1;
if(hash[ s[i] ] + 1 > start )
start = hash[ s[i] ] +1;
请问它在做什么?
那不是哈希表。 hash
变量是一个 int 数组,由字符串中 char 的 ascii 代码索引,因此 hash[s[i]] 其中 s[i]=='A' 是 hash[63] .所以,它所做的是将字符的位置存储在由字符代码索引的数组中。
hash[s[i]]!=-1
检查是否出现字符
for(int j=start; j 从 start 到字符集 hash[position] 的当前位置为 -1。这一定是错误的或错误的,因为它混合了基于字符的具有 j.</p> 位置性质的哈希索引
<p> if(hash[ s[i] ] + 1 > start ) start = hash[ s[i] ] +1;
如果当前字符的位置在start之后,则在当前字符之后设置start。