【问题标题】:Searching for substrings in a string. There is also a delimiter. This is java搜索字符串中的子字符串。还有一个分隔符。这是java
【发布时间】:2018-07-20 18:19:05
【问题描述】:

我有一个包含字符串的文本文件。我的问题是我不知道如何搜索特定的字符串。我似乎只能搜索某些字符。我需要使代码递归。

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;
import java.util.Stack;


public class LangValidator {
    private static final char delimeter    = '$';
    public static boolean isValidString(String s) {
        //Hint: use a stack of characters:
        Stack<Character> stack = new Stack<Character>();
        int i = 0;
        char c;
        while (i < s.length()) {
            c = s.charAt(i);
            if (c == delimeter)
                break;
            stack.push(c);
            i++;
        }
        i++;
        while (i < s.length()) {
            c = s.charAt(i);
            if (stack.isEmpty())        return false;
            if (stack.pop() != c)       return false;
            i++;
        }
        return stack.isEmpty();
    }

//这是我有错误的部分。我可以搜索特定字符,但是当我尝试使用字符串时,我得到一个错误,我只能添加字符常量。

public static boolean isValidStringRec(String s) {
        if (s == null) return false;
        char[] ch = s.toCharArray();
        for (char c : ch) if (c != '$' && c != 'b') return true;
        if(s == "$$$") return false;
        return false;


    }



    public static void main(String[] args) throws FileNotFoundException {
        Scanner fin = new Scanner(new FileReader("input.txt"));
        while (fin.hasNext()) {
            String str = fin.nextLine();
            System.out.println(str);
            System.out.println(isValidStringRec(str));
            System.out.println();
        }
    }



}

更新:这是输入文件:

$
$$$
a$a
abab$abab
ab$ba$ab$ba
aba$abaa
bbbaaa$aaabbb
aabb$bba
aba$aba

【问题讨论】:

  • 旁注:您在某些地方使用花括号,而在其他地方则没有。你应该在所有的 for、if、while 等之后使用它们来使代码清晰易读。
  • 很高兴知道,谢谢。
  • 你能澄清一下你的问题吗?根据您所讨论的方法的代码,如果给定的字符串仅由 3 个 $ 组成,它似乎返回 false。对吗?
  • 另外,如果给定字符串中的字符都不是'$'和'b',您能否确认该方法应该返回true,并且在所有其他情况下将返回false?跨度>

标签: java string recursion character constants


【解决方案1】:

假设该方法仅在没有字符为b$时才返回true, 在所有其他情况下都是错误的,这是我的解决方案。

它检查第一个字符是否 给定的字符串是b$。如果计算结果为假,则字符串为 无效,它将返回 false。然而,如果计算结果为真,那么该方法被赋予 除第一个字符(已检查)外的字符串,以及 继续循环。

一旦该方法检查一个大小为 0 的字符串,就意味着没有 其中的字符是b$,因此将返回true;

我发现检查字符串是否为 $$$ 是多余的,因为如果字符串包含 $,它无论如何都会返回 false。

如果我误解了你的问题,我会相应地更改我的答案。

   public static boolean isValidStringRec(String s) {
    if(s.length() < 1)
        return true;
    if(s.charAt(0) != '$' && s.charAt(0) != 'b')
        return isValidStringRec(s.substring(1));
    return false;
}

【讨论】:

  • 很难区分不同的字符串。您能否将其添加为问题的一部分或在每个字符串之间放置更多空格?另外,我的方法可以满足您的需要吗?如果不是,具体应该怎么做?
  • 感谢您的 cmets,我应该澄清一下。我有一个包含字符串的输入文件。我需要代码来读取字符串并确定该字符串是否属于以下语言。基本上,当字符串被推入堆栈时,它应该继续前进,直到它碰到分隔符 $。然后它将开始弹回,例如....如果我有一个字符串 aba$aba 那么这是语言的一部分。如果我有一个字符串 abab$abab 那么那不是语言的一部分。
  • 请帮帮我@burrito77
  • 如果 (s == null) return false; char[] ch = s.toCharArray(); if(s == "$$$") {return true;} if(s == "a$a") {return true;} if(s == "aba$aba") {return true;} if( s == "bbbaaa$aaabbb") {return true;} { return false; } } 但它不起作用
  • @Issajatt 递归不起作用,还是根本不起作用?此外,您能否在您提供的输入旁边添加预期输出?您似乎正在尝试查看给定的字符串是否是回文。
【解决方案2】:

好的,根据我们的对话,这里有一种查找字符串是否为回文的递归方法。

public static boolean isValidStringRec(String s) {
    if(s == null)
        return false;
    if(s.length() <= 1)
        return true;
    if(s.charAt(0) == s.charAt(s.length()-1))
        return isValidStringRec(s.substring(1, s.length()-1));
    return false;
}

它检查给定字符串的第一个和最后一个字符 是相同的,如果是,则测试字符串的其余部分是否是回文(子字符串是 包含第一个参数,排除第二个参数)。

如果给定字符串的第一个和最后一个字符不相同,则该字符串不是 palindrome 等会返回 false。

返回 true 的唯一方法是字符串的长度是否为 1 或 0。 如果原始字符串的长度是奇数,它将为 1,这意味着所有先前的对 字符串相同,回文也相同(如赛车),如果原始字符串长度为 0 字符串的长度是偶数,并且之前的所有字符串对都是相同的(如 anna)。

需要注意的是,如果回文不必区分大小写,此方法将不起作用, 因此,如果您也需要它,请尝试修复它或询问我会编辑它。

【讨论】:

    猜你喜欢
    • 2023-02-02
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多