题目地址:
https://leetcode.com/problems/longest-nice-substring/description/
给定一个只含英文字母的长 n n n字符串 s s s,求其最长子串使得该子串里所有的字母大小写都出现过。如果有多个解,则返回最左边那个。
直接暴力枚举所有子串。在判断子串是否满足条件的时候,可以用位运算来做,开两个
32
32
32位整数
x
,
y
x,y
x,y,
x
x
x的第
i
i
i个二进制位表示'a' + i
是否出现过,
y
y
y的第
i
i
i个二进制位表示'A' + i
是否出现过,这样满足条件等价于
x
=
y
x=y
x=y。代码如下:
class Solution {
public:
string longestNiceSubstring(string s) {
string res;
for (int i = 0; i < s.size(); i++) {
int x = 0, y = 0;
for (int j = i; j < s.size(); j++) {
islower(s[j]) ? x |= 1 << s[j] - 'a' : y |= 1 << s[j] - 'A';
if (x == y && j - i + 1 > res.size()) res = s.substr(i, j - i + 1);
}
}
return res;
}
};
时间复杂度 O ( n 2 ) O(n^2) O(n2),空间 O ( 1 ) O(1) O(1)。