首页 > 解决方案 > 如何使用此方法检查给定字符串中的字符是否可以拼写另一个字符串中的单词?

问题描述

public static String removeChar(String tiles, char ch) {
   String removedWord = "";
   int single = 0;
   for(int i = 0; i < tiles.length();i++) {
     if(tiles.charAt(i) != ch || single == 1) {
       removedWord = removedWord + tiles.charAt(i);
     }else if(single == 0) {
       removedWord = removedWord + "";
       single++;
     }
   }return removedWord;

 }

我必须创建一个方法来检查字符串中的字符是否可以拼写另一个字符串中的单词,例如

我必须使用上面的 removeChar 方法。我不能使用子字符串。请帮忙,我已经为此工作了好几天,但无法弄清楚

标签: java

解决方案


第一个参数——字符集

第二个参数——单词

您想循环遍历第二个参数中的所有字符,然后检查当前字符被循环的频率是否大于第一个参数中当前字符的频率。如果是,那么我们知道我们没有足够的字符来构造那个词。

例如,假设我们的字符集是WQXOACW并且要构造的词是COW。我们遍历 中的每个字符COW,并检查每个字符出现的次数。C出现一次。然后我们检查C字符集中的频率。在这种情况下,它也是 1。如果它更小(例如,0),那么我们会知道我们没有足够的字符来创建单词,因为我们没有足够的字符,所以我们返回false

public static boolean canSpell(String scrambled, String target) {
    int tlength = target.length();
    for(int i = 0; i < tlength; i++) {
        char c= target.charAt(i);
        if(frequency(target,c) > frequency(scrambled,c)) {
            return false;
        }
    }
    return true;
}
public static int frequency(String scrambled, char c) {
    int l = scrambled.length();
    int s = 0;
    for(int i = 0; i < l; i++) {
        s = s + (scrambled.charAt(i) == c ? 1 : 0);
    }
    return s;
}

测试运行

canSpell("WQXOACW","COW") //true
canSpell("WQXOACW","CO") //true
canSpell("WQXOACW","COWWW") //false

为了进一步优化效率(在上面的代码中,我们碰巧检查了相同字符出现多次的频率),我们可以使用以下方法删除字符串中的所有重复字母:

public String removeDuplicates(String input){
    String result = "";
    for (int i = 0; i < input.length(); i++) {
        if(!result.contains(String.valueOf(input.charAt(i)))) {
            result += String.valueOf(input.charAt(i));
        }
    }
    return result;
}

推荐阅读