如何写一个函数布尔成功(char a,char b,String s)?使用s.equals(“”),s.charAt(0),s.substring(1)

时间:2013-08-07 19:13:27

标签: java string

我正在尝试编写一个带字符串s的函数,如果字符b的每次出现总是由字符a继承,则返回true,否则返回false。 我试过了:

boolean succeeds(char a, char b, String s) {
    boolean to_return = true;
    boolean seen_a = false;
    while(true) {
        if (s.equals("")) return to_return;
            char c2 = s.charAt(0);
            if (c2 == a) seen_a = true;
            if (c2 == b) {
                if (!seen_a) return false;
            }
            s = s.substring(1);
        }
    }
}

我认为我有正确的想法。但我不知道怎么把它放在一起。

7 个答案:

答案 0 :(得分:7)

根据指南,你可以按照

的方式做点什么
while (!s.equals("")) {
    char c = s.charAt(0);  // record first char
    s = s.substring(1);    // cut off first char


    // if "first char is 'b' and next is
    // not 'a'", we can return false
    if (c == b && (s.equals("") || s.charAt(0) != a))
        return false;                
}

return true;

顺便说一句,这可以更轻松地完成:

return s.replace(""+b+a, "").indexOf(b) < 0;

(我刚注意到这种方法最初在@JosephMyers' answer

中列出

答案 1 :(得分:4)

这听起来像是家庭作业,所以你可能有责任弄清楚细节,但无论如何,我想到了一些建议。

例如,您可以尝试:

  1. 删除临时字符串中出现的所有“ba”。
  2. 如果临时字符串中没有其他字母“b”,则返回true
  3. 否则返回false
  4. 提示:您可以在步骤1中使用replace method,在步骤2中使用indexOf。(单击教程/说明的链接您应该能够在两行或三行代码中执行此操作,取决于您是否使用三元运算符作为返回值。)

答案 2 :(得分:2)

不一定非常复杂。例如:

for (i = 0; i < s.length - 1; i++) {
  if (s.charAt(i - 1) == b && s.charAt(i) != a) {
    return false;
  }
}
return !s.endsWith(String.valueOf(b));

答案 3 :(得分:1)

假设你只限于你在标题中输入的功能,并且你想检查每个b后面是否有一个(而不是相反):你已经到了一半,但你的逻辑是一个有点倒退。当你浏览字符串时:

(1)当你看到“b”时,你需要记住这个事实。所以你可能想要一个变量seen_b而不是seen_a。

(2)在下一个角色上,如果你还记得你刚刚看到“b”,那么你需要确保下一个角色是“a”。而不是

if (c2 == b) {
    if (!seen_a) return false;
}

你可能应该有像

这样的东西
if (seen_b) {
    if (c2 != a) return false;
}

或更简洁

if (seen_b && c2 != a) return false;

(3)因为seen_b == true表示你看到的 last 字符是b,所以每次看到不是b的东西时,请确保将其设置为false。

(4)确保在字符串的最后一个字符为b时正确执行操作。你必须返回false,因为后面没有“a”。

答案 4 :(得分:0)

这样的事情应该有效。我没有编译这个。希望它能帮助您找到正确的方向,即使可能存在语法错误。

public boolean succeeds(char a, char b, String s){
    boolean sawFirst= false;
    for(int i=0;i<s.length();i++){
        if(!sawA){
            if(s.charAt(i)==b)
                sawFirst = true;
        }
        else{
            if(s.charAt(i)!=a)
                return false;
            else sawFirst= false;
        }
    }
    return true;
}

答案 5 :(得分:0)

使用s.equals(“”),s.charAt(0),s.substring(1)?

怎么样:

public static boolean succeeds(final char a, final char b, String s)
{
if(s==null||s.equals(""))
  return true;
char previousFirstChar,newFirstChar;
previousFirstChar=s.charAt(0);
while(true)
  {
  s=s.substring(1);
  if(s.equals(""))
     {
     if(previousFirstChar==b)
       return false;
     break;
     }
  newFirstChar=s.charAt(0);
  if(previousFirstChar==b && newFirstChar!=a))
    return false;
  previousFirstChar=newFirstChar;
  }
return true;
}

答案 6 :(得分:0)

看看你的标题,我不清楚你是否意味着 使用s.equals,.charAt和.substring。但是,如果没有,您可以使用正则表达式.*b[^a].*|.*b$(谢谢 ajb ),如果函数匹配b后跟任何字符,ab 1}}(或字符串末尾的特殊情况import java.util.regex.Pattern; ... public boolean succeeds (char a, char b, String s) { String quoteda = Pattern.quote(Character.toString(a)); String quotedb = Pattern.quote(Character.toString(b)); return !(s.matches(".*" + quotedb + "[^" + quoteda + "].*|.*" + quotedb + "$")); } ),例如:

a

请注意,如果字符串根本不包含public boolean succeeds (char a, char b, String s) { if (s.indexOf(b) == -1) return false; String quoteda = Pattern.quote(Character.toString(a)); String quotedb = Pattern.quote(Character.toString(b)); return !(s.matches(".*" + quotedb + "[^" + quoteda + "].*|.*" + quotedb + "$")); } ,则返回true。如果你希望它在这种情况下返回false,你必须先检查:

public boolean succeeds (char a, char b, String s) {

    int state = 0;

    for (int n = 0; n < s.length(); ++ n) {
        if (state == 0) {
            if (s.charAt(n) == b)
                state = 1;
        } else if (state == 1) {
            if (s.charAt(n) == a)
                state = 0;
            else
                return false;
        }
    }

    return (state == 0);

}

我们使用Pattern.quote的原因是允许它处理正则表达式中具有特殊含义的字符,例如']'。

如果你不能使用正则表达式,那么状态机方式方法会给你带来好结果:

{{1}}

由于只有两个状态,你可以使用布尔值。