给定一个字符串,请返回满足以下条件的最长字符串的长度:“a”、"b"、“c”、“x”、"y"、“z”在字符串中都恰好出现了偶数次(0也是偶数)
题目描述
给定一个字符串,请返回满足以下条件的最长字符串的长度:“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; } }