为了账号安全,请及时绑定邮箱和手机立即绑定

Java:需要查看输入字符串中的每个字符是否与“字母表”中的任何字符匹配

Java:需要查看输入字符串中的每个字符是否与“字母表”中的任何字符匹配

Cats萌萌 2022-12-21 10:42:18
我正在实施 DFA。给定的字母表是 {a, b}。我有它告诉我输入字符串是否被接受。(它有一个简单的“接受”规则——输入字符串的第一个和最后一个字符必须相同)不过,我想做的是检查输入字符串中的每个字符是否符合规定的“字母表”。因此,作为布尔值,如果输入字符串为“abcdefg”(例如),它将返回 false ... 如果输入字符串为“abbaabbbba”(例如),它将返回 true我需要检查 a 是否在字母表中...然后 b 是否在字母表中...然后 c 是否在字母表中...输入字符串中的每个字符等等。我尝试了不同类型的循环变体,(我不记得每一个变体!)将 inputString.charAt(i) 与字母表中的每个字符进行比较......但到目前为止,没有任何东西像我需要/想要的那样工作到。例如,现在我正在尝试:  public boolean isInAlphabet(String inputString) {    if(inputString == " ") {      System.out.println("   -> empty string is not in our alphabet");      return false;    }    for(int i = 0; i < inputString.length(); i++) {      Character check = inputString.charAt(i);      System.out.print(check);  // just to see what it's doing      if(check.equals(alphabet.charAt(0)) || check.equals(alphabet.charAt(1))) {        System.out.println("   -> your input string is in our alphabet");        return true;      }      else{        System.out.println("   -> your input string is *not* in our alphapet");        return false;      }    }    return false;  }字母表示为:String alphabet = "ab";输入字符串如下:String inputString = "abcdefg";事情是,它在发现输入字符串中的第一个字符在字母表中后停止检查。像:test input string: abcdefgis test input string in our alphabet?a   -> your input string is in our alphabet...这就是它所做的所有进一步检查。我如何让它根据字母表检查整个输入字符串——输入字符串的每个字符?就像我说的,我什至不记得到目前为止我尝试过的所有事情,但至少有十几个。我尝试的越多,我就越困惑。这感觉很简单,但我不确定如何让它工作。
查看完整描述

2 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

我在这里假设如果字母表包含来自 inputString 的所有字符并且 inputString 的第一个和最后一个字符相同那么它是有效的。


但例如,Alphabet = {a,b} 和 inputString="aaaaa"。所以,我假设这个输入也是有效的。(如果这就是您要查找的内容,那么您可以使用以下逻辑来解决它。)我将 HashSet 用于字母表,然后我们可以迭代整个字符串并检查字母表是否包含它。下面的代码用于将字母字符串转换为 HashSet。


    String str="ab";

    for(char ch:str.toCharArray()){

        alphabet.add(ch);

    }

现在,要实现检查有效输入的方法,您可以考虑以下代码。


public boolean isInAlphabet(String inputString) {

    if(inputString==null || inputString.length()==0) return false;

    if(inputString.charAt(0)!=inputString.charAt(inputString.length()-1)) return false;

    for(char ch:inputString.toCharArray()){

        if(!alphabet.contains(ch)) return false;

    }

    return true;

}


查看完整回答
反对 回复 2022-12-21
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

这只是如何进行的模式,它更像是一种通用模式,在这种情况下会根据您的目的进行调整。
(仅当第一个字符与最后一个字符相同时才接受)

这是您问题的 DFA。

//img1.sycdn.imooc.com//63a274ce0001d60f06470537.jpg

基本上有内部状态(圆圈)和转换(箭头) 状态


S1->开始状态(总是从这里开始)
S2,S3->中间(当输入完成并且此状态不被接受时)
S4,S5->最终状态(输入完成,然后接受此状态)`


Transitions[movements array]
(StateA, StateB, char) : 从 SA 到 SB with char
(S1,S3,a) : T1
(S1,S2,b) : T2
(S3,S3,b) : T3
(S3, S4,a) : T4
(S4,S4,a) : T5
(S2,S2,a) : T6
(S4,S3,b) : T7
(S2,S5,b) : T8
(S5,S2,a) : T9
(S5,S5,b) : T10

例如:
1:abb
(S1,a)->S3 by T1
(S3,b)->S3 by T3
(S3,b)->S3 by T3
End on S3 and input is not accepted

2:babb
(S1,b)->S2 by T2
(S2,a)->S2 by T6
(S2,b)->S5 by T9(接受如果输入是finish:bab,这里不是)
(S5,b) ->S5 by T10
在 S5 上结束并接受输入

对于任何其他不在字母表中的字符遇到,立即返回不接受。

对于编码,需要添加状态和转换。在每一步逐个检查输入字符时,然后正确更新当前状态。

希望对你有用。


查看完整回答
反对 回复 2022-12-21
  • 2 回答
  • 0 关注
  • 79 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信