【问题标题】:Using Recursion to compare letters contained in a string?使用递归比较字符串中包含的字母?
【发布时间】:2017-07-03 14:57:40
【问题描述】:

在取两个单词后,利用递归判断第一个单词的字母是否包含在第二个单词的 ANY ORDER 中。

我们只能使用 .charAt 字符串方法,.contains 也是不允许的。

我想从第一个单词的第一个字符开始,看看它是否等于 charAt 第二个单词的长度 -1,然后返回一个长度为 -1 的子字符串,但这不能正常工作。

public static boolean containedWordsCheck(String firstWord,String secondWord) {
//Recursion
        if (firstWord.charAt(0) == secondWord.charAt(secondWord.length()-1))
            return containedWordsCheck(firstWord.substring(1, firstWord.length()-1),secondWord.substring(1, secondWord.length() - 1));
        //If it reaches this far it means the letters in the first string aren't contained in the second string
        return false;

【问题讨论】:

  • 如果第一个词是"apple",那么第二个词中一定要有两个p吗?
  • 如果第二个单词中的字符可以以任何顺序,则您的逻辑将失败,因为您将第一个单词中的第一个字符与 last 第二个单词中的字符,但不是第二个单词中的任何其他字符。 “以任何顺序”意味着该字符可以在第二个单词中的任何位置,对吗?你的逻辑还有其他错误,但无论如何你都需要想出一个更好的计划。
  • 你学习过循环吗?
  • 如果允许使用字符串缓冲区或子字符串,也许我可以看到递归点。如果不是,很难看出,但如果你的教授坚持,当然可以使用递归。 :-)
  • containedWordsCheck("abbbb","aaaba") 必须是真还是假?

标签: java recursion


【解决方案1】:

这样的事情应该可以工作。它使用辅助递归函数,并且仅使用您建议的 charAt() 。复杂度为 O(n^2)。如果您进行预排序,那么您可以在其他答案中看到它会容易得多。

public boolean containedWordsCheck(String firstWord,String secondWord) {
    if (firstWord.isEmpty()) {
        return true;
    }
    if (containChar(secondWord, firstWord.charAt(0))) {
        return true && containedWordsCheck(firstWord.substring(1, firstWord.length()), secondWord);
    } else {
        return false;
    }
}

public boolean containChar(String word, char ch) {
    if (word.isEmpty()) {
        return false;
    }
    if (word.charAt(0) == ch) {
        return true || containChar(word.substring(1, word.length()), ch);
    } else {
        return containChar(word.substring(1, word.length()), ch);
    }
}

【讨论】:

  • 一方面这是用勺子喂食,可能不是帮助提问者的最佳方式。另一方面,这个想法是完全正确的。
  • @Ole V.V.你说得对,下次我会更小心的;)。
【解决方案2】:
import java.util.Arrays;

public class FunLetters {

    public static void main(String[] args) {


        String a = "apple";
        String b = "pplea";

        char[] aArr = a.toCharArray();
        Arrays.sort(aArr);
        char[] bArr = b.toCharArray();
        Arrays.sort(bArr);
        boolean answer = checkForSameString(aArr, bArr, 0);
        System.out.println(answer);

    }


    private static boolean checkForSameString(char[] a, char[] b, int i) {

        if (i == a.length || i == b.length)
            return true;
        if (a[i] == b[i])
            return checkForSameString(a, b, i + 1);
        return false;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    相关资源
    最近更新 更多