String two pointer swapping (合集)

来源:互联网 发布:sja1000 接收数据 编辑:程序博客网 时间:2024/05/19 23:59

相似点,一般都是设置两个指针start和end在string的初始位置。

使用和ASCII相同大小的hash来记录每个字母是否出现过,或者出现的次数(或位置)。

end指针一直向前走,直到不满足条件,判断当前[start, end]区间是否符合,然后start指针向前走直到满足条件为止。

然后再前移end指针,重复以上操作。


相关问题:

1. Minimum Window Substring (http://blog.csdn.net/starmsg/article/details/27561027)

需要记录

  1.   int needFind[256] = {0};  
  2.   int hasFound[256] = {0}; 

以及当前区间的字符总数

2. Longest Substring with Two Unique Charachters (http://blog.csdn.net/starmsg/article/details/40081849)

需要记录[start, end]中每个字符出现的次数,以及当前区间的unique字符数量。

#include <iostream>#include <climits>#include <cmath>#include <string>#include <cstring>using namespace std;string longest(string str){    int longest = 0;int longest_start = -1;int occurance[256];int count = 0;memset(occurance, 0, sizeof(occurance));int len = str.size();int start = 0;for(size_t i = 0; i<len; i++){occurance[str[i]]++;        if(occurance[str[i]] == 1)        count++;                if(count == 3)        {            cout << i << "start" << endl;        if(i-start > longest)        {        longest = i-start;        longest_start = start;                cout << i << " longest " << longest << endl;        }                        while(count == 3)            {                occurance[str[start]]--;            if(occurance[str[start]] == 0)            count--;                start++;            }        }    }    if(len - start > longest)    {        longest = len-start;        longest_start = start;    }    return str.substr(longest_start, longest);}int main(){    cout << longest("aabadefghaabbaa") << endl;   return 0;}


3. Longest Substring Without Repeating Characters (http://blog.csdn.net/starmsg/article/details/21412261)

需要记录每个字符最后一次出现的位置。


4 Longest Substring that has All Consecutive Characters.

 to be completed


5. Minimum Window Substring with at Least N characters

int minsubstr(string &str, int n){const int nn = str.size();int map[256];memset(map, 0, sizeof(map));int unique = 0;int start = 0;int minlength = INT_MAX;int minstart = -1;for(int i=0; i<nn; i++){map[str[i]]++;if(map[str[i]] == 1){unique++;if(unique == n){while(map[str[start]] > 1 && start < i){map[str[start]]--;start++;}if(i-start+1 < minlength){minlength = i-start+1;minstart = start;}if(start < i){map[str[start]]--;if(map[str[start]] == 0)unique--;start++;}}}}if(minlength != INT_MAX){cout << minstart << "\t" << minlength << endl;cout << str.substr(minstart, minlength) << endl;}elsecout << "no valid substring found" << endl;return 0;}



0 0
原创粉丝点击