Java问题:检查字符串是否包含另一字符串全部字符(含重复次数)
修复字符重复次数验证方法的问题
问题描述
现有方法isItemUsable2仅验证第二个字符串的字符是否存在于第一个字符串中,未考虑字符的重复次数。例如当word1 = "12345++"、word2 = "155"时,原方法返回true,但实际应返回false——因为word1中仅包含1个字符5,无法满足word2中2个5的需求。
原方法的缺陷
原方法通过遍历word2逐个检查字符是否在word1中存在,每次匹配就增加计数,最后比较计数与word2长度。这种逻辑只关注字符是否存在,完全忽略了字符出现的次数限制,导致重复字符的验证失效。
修复方案
方案1:使用ASCII数组统计字符频率(适用于普通ASCII字符场景)
通过数组记录每个ASCII字符在word1中的出现次数,再遍历word2逐个扣除计数,若某字符计数不足则直接返回false。
public boolean isItemUsable2(String word1, String word2) { // 初始化ASCII字符计数数组,覆盖所有ASCII字符范围 int[] charCounts = new int[256]; // 统计word1中每个字符的出现次数 for (char c : word1.toCharArray()) { charCounts[c]++; } // 验证word2的每个字符及次数 for (char c : word2.toCharArray()) { if (charCounts[c] == 0) { // 字符不存在或剩余次数不足 return false; } // 扣除已使用的字符次数 charCounts[c]--; } return true; }
方案2:使用HashMap统计字符频率(支持所有Unicode字符,通用性更强)
如果需要处理非ASCII的Unicode字符,使用HashMap来统计字符出现次数,逻辑与数组方案一致,但兼容范围更广。
import java.util.HashMap; import java.util.Map; public boolean isItemUsable2(String word1, String word2) { Map<Character, Integer> charCountMap = new HashMap<>(); // 统计word1中每个字符的出现次数 for (char c : word1.toCharArray()) { charCountMap.put(c, charCountMap.getOrDefault(c, 0) + 1); } // 验证word2的每个字符及次数 for (char c : word2.toCharArray()) { int currentCount = charCountMap.getOrDefault(c, 0); if (currentCount == 0) { return false; } charCountMap.put(c, currentCount - 1); } return true; }
验证效果
针对测试场景word1 = "12345++"、word2 = "155":
- 统计
word1后,字符5的计数为1。 - 遍历
word2时,第一个5将计数减为0,第二个5检查时发现计数为0,直接返回false,符合预期结果。
内容的提问来源于stack exchange,提问作者pizzawithpineapple
相关产品推荐
相关产品推荐

