题目地址:
https://www.lintcode.com/problem/find-the-number-of-balance-in-the-string/description
给定一个字符串 s s s,可以将其划分为两个子串,使得两个子串含字母类数一样。问多少种划分方案。题目保证 s s s非空。
思路是开两个哈希表,分别存左右子串的各个字母出现次数。接着枚举划分点,当左右字母类数相同则更新答案。代码如下:
import java.util.HashMap;
import java.util.Map;
public class Solution {
/**
* @param S: the string
* @return: return the number of “Balance” in the string
*/
public int find(String S) {
// write your code here
Map<Character, Integer> left = new HashMap<>(), right = new HashMap<>();
for (int i = 0; i < S.length(); i++) {
char ch = S.charAt(i);
right.put(ch, right.getOrDefault(ch, 0) + 1);
}
int res = 0;
// 枚举左子串是s[0 : i],右子串是s[i + 1: ]的情况
for (int i = 0; i < S.length() - 1; i++) {
char ch = S.charAt(i);
left.put(ch, left.getOrDefault(ch, 0) + 1);
right.put(ch, right.get(ch) - 1);
if (right.get(ch) == 0) {
right.remove(ch);
}
if (left.size() == right.size()) {
res++;
}
}
return res;
}
}
时空复杂度 O ( l s ) O(l_s) O(ls)。