我正在实施DFA。给定的字母为{a,b}。
我告诉我输入字符串是否被接受。 (它有一个简单的“接受”规则-输入字符串的第一个和最后一个字符必须相同)
但是,我要检查的是检查输入字符串中的每个字符是否符合规定的“字母”。
因此,作为布尔值,如果输入字符串是“ abcdefg”(例如),它将返回false;如果输入字符串是“ abbaabbbbba”(例如),它将返回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: abcdefg
is test input string in our alphabet?
a -> your input string is in our alphabet
...这就是进一步检查的全部内容。
如何获取整个输入字符串(即输入字符串的每个字符)与字母的对照?
就像我说的那样,我什至不记得到目前为止我尝试过的所有事情,但是至少已经打了十二遍。我尝试的次数越多,就会感到困惑。感觉很简单,但是我不确定如何使它工作。
答案 0 :(得分:1)
我在这里假设,如果字母表包含inputString和inputString的第一个和最后一个字符相同的所有字符,那么它是有效的。
例如,字母= {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;
}
答案 1 :(得分:0)
这只是一个进行模式的架构,更像是一般模式,
在这种情况下适合您的目的。
(仅当第一个字符与最后一个字符相同时接受)
这是您遇到问题的DFA。
基本上有内部状态(圆圈)和过渡状态(箭头)
状态:
S1->开始状态(总是从这里开始)
S2,S3->中介(输入完成后不接受此状态)
S4,S5->最终状态(输入完成,然后接受此状态)`
转场[运动数组]
(StateA,StateB,字符):从SA到SB(带字符)
(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由T1
(S3,b)-> T3的S3
(S3,b)-> T3的S3
在S3上结束并且不接受输入
2:babb
(S1,b)-> S2,由T2
T6的
(S2,a)-> S2
(S2,b)-> S5,用T9表示(如果输入完成,则可以接受:bab,这里不是)
(S5,b)-> T5的S5
在S5上结束并接受输入
对于任何其他非字母字符遇到的字符,请立即返回并且不接受。
对于编码,需要添加状态和转换。 然后每个步骤都会正确更新当前状态。
希望对您有用。