题目描述
给定一个字符串,请返回满足以下条件的最长字符串的长度:“a”、“b”、“c”、“x”、“y”、“z”在字符串中都恰好出现了偶数次(0也是偶数)
输入例子1:
abcda
输出例子1:
1
例子说明1:
子串中只有d满足要求
输入例子2:
acmdcb
输出例子2:
4
例子说明2:
子串中cmdc满足要求
题目分析
使用HashMap来存放数据。Key存放“a”、“b”、“c”、“x”、“y”、“z”的状态,Value存放长度,int型变量maxLen存放最长字串长度。
在Key中,“a”、“b”、“c”、“x”、“y”、“z”各占一位标志位,对于字符串s,对其进行遍历,如果发现字符为“a”、“b”、“c”、“x”、“y”、“z”其中一个,则改变Key中对应的标志位。字符串中出现过奇数次上述字符,则对应位置为1,否则为0。如果出现已经出现过的标志位,则证明从出现过标志位的位置到现在满足“a”、“b”、“c”、“x”、“y”、“z”在字符串中都恰好出现了偶数次(0也是偶数)这一条件,可直接用当前的Value减去上次出现该标志位的Value,然后与当前的maxLen对比取大值即可。
代码实现
import java.util.*;
public class Main{
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in);
String next = scanner.next();
System.out.println(findTheLongestSubstring(next));
}
private static int findTheLongestSubstring(String s)
{
Map<Integer, Integer> map = new HashMap<>();
int state = 0;
int maxLen = 0;
map.put(0, -1);
for (int i = 0; i < s.length(); i++)
{
if (s.charAt(i) == 'a')
state ^= 0x000001;
if (s.charAt(i) == 'b')
state ^= 0x000010;
if (s.charAt(i) == 'c')
state ^= 0x000100;
if (s.charAt(i) == 'x')
state ^= 0x001000;
if (s.charAt(i) == 'y')
state ^= 0x010000;
if (s.charAt(i) == 'z')
state ^= 0x100000;
if (map.containsKey(state))
{
maxLen = Math.max(maxLen, i - map.get(state));
}
else
{
map.put(state, i);
}
}
return maxLen;
}
}