You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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":

  1. 统计word1后,字符5的计数为1。
  2. 遍历word2时,第一个5将计数减为0,第二个5检查时发现计数为0,直接返回false,符合预期结果。

内容的提问来源于stack exchange,提问作者pizzawithpineapple

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:10:34