一、问题描述
给定一个字符串 s,该字符串中只包含英文大小写字母。你需要计算从字符串中最多能组成多少个字符串 "ku"。每次可以随机从字符串中选一个字符,并且选中的字符不能再使用。字符串中的字符大小写可以忽略,即大写和小写字母视为相同。
例如,输入 "AUBTMKAxfuu",从中最多能组成 1 个 "ku"。
二、测试样例
样例1:
输入:
s = "AUBTMKAxfuu"
输出:1
样例2:
输入:
s = "KKuuUuUuKKKKkkkkKK"
输出:6
样例3:
输入:
s = "abcdefgh"
输出:0
三、思路
用哈希表保存字符对应的数量,并且只有在字符是'k'或'u'时才保存(不区分大小写),然后找出'k'字符或'u'字符的数量的最小值。
四、代码
方法1
public static int solution(String s) {
char b;
HashMap<Character, Integer> CountMap = new HashMap<>();
CountMap.put('k', 0);
CountMap.put('u', 0);
for(char a:s.toCharArray()){
if(a=='k'||a=='K'){
b='k';
CountMap.put(b, CountMap.getOrDefault(b, 0) + 1);
}
else if(a=='u'||a=='U'){
b='u';
CountMap.put(b, CountMap.getOrDefault(b, 0) + 1);
}
}
int minCount = 100;
for (int count : CountMap.values()) {
if (count <minCount) {
minCount = count;
}
}
return minCount;
}
方法2
public static int solution(String s) {
HashMap<Character, Integer> CountMap = new HashMap<>();
CountMap.put('k', 0);
CountMap.put('u', 0);
String str=s.toLowerCase();
for(char a:str.toCharArray()){
if(a=='k'||a=='u'){
CountMap.put(a, CountMap.getOrDefault(a, 0) + 1);
}
}
int minCount=Math.min(CountMap.getOrDefault('k',0),CountMap.getOrDefault('u',0));
return minCount;
}
五、代码详解
方法1:用另一个字符b保存大小写的情况
HashMap<Character, Integer> CountMap = new HashMap<>();
以字符为key,整型为value,创建哈希表。
CountMap.put('k', 0); CountMap.put('u', 0);
给哈希表的'k'和'u'初始赋值为0。
for(char a:s.toCharArray()){
if(a=='k'||a=='K'){
b='k';
CountMap.put(b, CountMap.getOrDefault(b, 0) + 1);
}
else if(a=='u'||a=='U'){
b='u';
CountMap.put(b, CountMap.getOrDefault(b, 0) + 1);
}
}
用tocharArray()将字符串类型转成字符数组类型,再用for each遍历字符数组。判断a是否是'k'或'u',用b保存大小写的情况,用getOrDefault()获取原本的value值,在此基础上加1。
int minCount = 100;
for (int count : CountMap.values()) {
if (count <minCount) {
minCount = count;
}
}
还是用for each遍历哈希表的value数组,找到字符最小的数量。
方法2:将字符串转成小写的情况
String str=s.toLowerCase();
用toLowerCase()把字符串转成小写。
for(char a:s.toCharArray()){
if(a=='k'||a=='u'){
CountMap.put(a, CountMap.getOrDefault(a, 0) + 1);
}
}
用tocharArray()将字符串类型转成字符数组类型,再用for each遍历字符数组。判断a是否是'k'或'u',用getOrDefault()获取原本的value值,在此基础上加1。
int minCount=Math.min(CountMap.getOrDefault('k',0),CountMap.getOrDefault('u',0));
用getOrDefault()获取k和u的value值,用Math.min()找出两个字符的数量最小值。
六、函数的使用
- 哈希表的创建
- 字符串转换成字符数组
- 哈希表的添加
- 哈希表获取key对应的value值
- 哈希表获取value数组
- 字符串转成小写字符串