问题描述及声明代码如下:
#pragma once
#include <unordered_map>
#include <iostream>
#include <algorithm>
using namespace std;
/*问题描述:
给定一个字符串s, 其中都是小写字母,
如果s中的子串含有的每种字符都是偶数个,称达标子串,子串要求是连续串
返回s中达标子串的最大长度
1<=s.length<=10^5
*/
int getMinDaBiaoSubStringLen(string);
实现代码及注释如下:
#pragma once
#include "withStringDeclare.h"
int getMinDaBiaoSubStringLen(string s) {
//status记录当前子串中每个字母的奇偶状态
//status为32位,从最低位0到25位,分别代表a到z
//如果当前子串中的某个字母个数为奇数个,则status对应位为1,否则为0
int status = 0;
//record记录某个状态的及其出现的最早遍历位置
unordered_map<int, int> record;
//没有开始遍历时,状态为0
//此项必须,否则当后序遍历出现0状态计算最大长度时会出错
record[0] = -1;
//返回结果
int res = 0;
for (int i = 0; i < s.size(); ++i) {
//通过1左移相应位数和异或更新status
status ^= (1 << (s[i] - 'a'));
if (record.find(status) != record.end()) {
res = max(res, i - record[status]);
}
else {
record[status] = i;
}
}
return res;
}
测试代码及结果如下:
#include <iostream>
//#include "priority_queue.h"
//#include "Trie.h"
#include "withStringDeclare.h"
#include <string>
using namespace std;
int main(void) {
string s = "aabbcddca";
int res = getMinDaBiaoSubStringLen(s);
cout << "res: " << res << endl; //输出为res:8
return 0;
}
编译平台:VS017