这就是问题:
问题我。
我们将Pestaina字符串定义如下:
- ab是Pestaina字符串。
- cbac是Pestaina字符串。
- 如果S是Pestaina字符串,那么SaS也是如此。
- 如果U和V是Pestaina字符串,UbV也是如此。
醇>这里a,b,c是常数,S,U,V是变量。在这些规则中, 相同的字母代表相同的字符串。所以,如果S = ab,则规则3 告诉我们abaab是一个Pestaina字符串。在规则4中,U和V代表 爷爷的字符串,但它们可能不同。
编写方法
public static boolean isPestaina(String in)
如果in是Pestaina字符串,则返回true,否则返回false。
这就是我到目前为止只适用于第一条规则的内容,但有些情况不适用于例如“abaaab”:
public class Main {
private static boolean bool = true;
public static void main(String[] args){
String pestaina = "abaaab";
System.out.println(pestaina+" "+pestainaString(pestaina));
}
public static boolean pestainaString(String p){
if(p == null || p.length() == 0 || p.length() == 3) {
return false;
}
if(p.equals("ab")) {
return true;
}
if(p.startsWith("ab")){
bool = pestainaString(p, 1);
}else{
bool = false;
}
return bool;
}
public static boolean pestainaString(String p, int sign){
String letter;
char concat;
if("".equals(p)){
return false;
}
if(p.length() < 3){
letter = p;
concat = ' ';
p = "";
pestainaString(p);
}else if(p.length() == 3 && (!"ab".equals(p.substring(0, 2)) || p.charAt(2) != 'a')){
letter = p.substring(0, 2);
concat = p.charAt(2);
p = "";
pestainaString(p);
}else{
letter = p.substring(0, 2);
concat = p.charAt(2);
pestainaString(p.substring(3));
}
if(letter.length() == 2 && concat == ' '){
if(!"ab".equals(letter.trim())){
bool = false;
//concat = 'a';
}
}else if((!"ab".equals(letter)) || (concat != 'a')){
bool = false;
}
System.out.println(letter +" " + concat);
return bool;
}
}
请告诉我我做错了什么。
答案 0 :(得分:0)
您正在描述Context Free Language,可以将其描述为Context Free Grammer并使用它进行解析。解析这些问题的领域已经得到了广泛的研究,并且有很多资源可供选择。
维基百科页面还讨论了一些algorithms来解析这些内容,具体而言 - 我认为您对Early Parsers
感兴趣我也相信这种“语言”可以使用push down automaton进行解析(虽然不是100%肯定)。
答案 1 :(得分:0)
我发现了问题,我正在调用错误的方法。
答案 2 :(得分:0)
public static void main(String[] args) {
// TODO code application logic here
String text = "cbacacbac";
System.out.println("Is \""+ text +"\" a Pestaina string? " + isPestaina(text));
}
public static boolean isPestaina(String in) {
if (in.equals("ab")) {
return true;
}
if (in.equals("cbac")) {
return true;
}
if (in.length() > 3) {
if ((in.startsWith("ab") || in.startsWith("cbac"))
&& (in.endsWith("ab") || in.endsWith("cbac"))) {
return true;
}
}
return false;
}
答案 3 :(得分:0)
这很有趣。
public boolean isPestaina(String p) {
Set<String> existingPestainas = new HashSet<String>(Arrays.asList(new String[]{"ab", "cbac"}));
boolean isP = false;
int lengthParsed = 0;
do {
if (lengthParsed > 0) {
//just realized there's a touch more to do here for the a/b
//connecting rules...I'll leave it as an excersize for the readers.
if (p.substring(lengthParsed).startsWith("a") ||
p.substring(lengthParsed).startsWith("b")) {
//good connector.
lengthParsed++;
} else {
//bad connector;
return false;
}
}
for (String existingP : existingPestainas) {
if (p.substring(lengthParsed).startsWith(existingP)) {
isP = true;
lengthParsed += existingP.length();
}
}
if (isP) {
System.err.println("Adding pestaina: " + p.substring(0, lengthParsed));
existingPestainas.add(p.substring(0, lengthParsed));
}
} while (isP && p.length() >= lengthParsed + 1);
return isP;
}