Java 在字符串中查找子序列

Java 在字符串中查找子序列,java,character-encoding,subsequence,Java,Character Encoding,Subsequence,我一直在解决Hackerrank的这一系列挑战,链接: 我提出了我的算法,它是这样的: 根据hackerrank字符串检查是否至少有两个a、r和k 检查它是否包含以下字符h、a、c、k、e、r、n、k 设p[0],p(1),p[2]…,p[9]是字符串中h,a,c,k,e,r,r,a,n,k的各自索引。如果p[0]s.indexOf('c')和&(s.indexOf('a')>s.indexOf('k'))&(s.indexOf('a')>s.indexOf('a')>s.indexOf('r'

我一直在解决Hackerrank的这一系列挑战,链接:

我提出了我的算法,它是这样的:

  • 根据hackerrank字符串检查是否至少有两个a、r和k
  • 检查它是否包含以下字符h、a、c、k、e、r、n、k
  • 设p[0],p(1),p[2]…,p[9]是字符串中h,a,c,k,e,r,r,a,n,k的各自索引。如果p[0] 我知道这是非常糟糕的,而且由于这个错误,
    由于超时而终止

    代码:

    我有一个名为hackerrankInString(String s)的方法,它返回“YES”或“NO”字符串

    //完成下面的hackerrankInString函数。
    静态字符串hackerrankInString(字符串s){
    int countR=0,countA=0,countK=0;
    //对于读取多行输入,它将单独执行操作
    //关于输入
    while(scanner.hasNextLine()){
    对于(int i=0;i=2&&countA>=2&&countK>=2){
    //如果字符串包含hackerrank
    如果(s.contains(Character.toString('h'))和&s.contains(Character.toString('a'))和&s.contains(Character.toString('c'))和&s.contains(Character.toString('k'))和&s.contains(Character.toString('r'))和&s.contains(Character.toString('n')){
    “s.indexOf(“h”)和(s.Indexxof(“h”)之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以之所以)){
    如果((s.indexOf('a')>s.indexOf('c')和&(s.indexOf('a')>s.indexOf('k'))&(s.indexOf('a')>s.indexOf('a')>s.indexOf('r'))和&(s.indexOf('a')>s.indexOf('r'))和(s.indexOf('a')>s.indexOf('a'))和&(s.indexOf('a')>s{
    如果((s.indexOf('c')>s.indexOf('k'))和&(s.indexOf('c')>s.indexOf('e'))&(s.indexOf('c')>s.indexOf('r'))和&(s.indexOf('c')>s.indexOf('a')和&(s.indexOf('c')>s.indexOf('n'))和&(s.indexOf('c')>s.indexOf('n')){
    如果((s.indexOf('k')>s.indexOf('e'))和&(s.indexOf('k')>s.indexOf('r'))&(s.indexOf('k')>s.lastinexof('r'))和&(s.indexOf('k')>s.indexOf('n'))和&(s.indexOf('k')>s.indexOf('n'))和&(s.indexOf('k')>s.lastinexof('k')){
    如果((s.indexOf('e')>s.indexOf('r'))和&(s.indexOf('e')>s.lastIndexOf('r'))&(s.indexOf('e')>s.lastIndexOf('a'))和&(s.indexOf('e')>s.indexOf('n'))和&(s.indexOf('e')>s.lastIndexOf('k')){
    如果((s.indexOf('r')>s.lastIndexOf('r'))和&(s.indexOf('r')>s.lastIndexOf('a'))和&(s.indexOf('r')>s.indexOf('n'))和&(s.indexOf('r')>s.lastIndexOf('k')){
    如果((s.lastIndexOf('r')>s.lastIndexOf('a'))&(s.lastIndexOf('r')>s.indexOf('n'))&(s.lastIndexOf('r')>s.lastIndexOf('k')){
    如果((s.lastIndexOf('a')>s.indexOf('n'))&&(s.lastIndexOf('a')>s.lastIndexOf('k')){
    如果(s.indexOf('n')>s.lastIndexOf('k')){
    返回“是”;
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    返回“否”;
    }
    
    请帮帮我,我想学两件事

    • 如何解决这一挑战
    • 如何有效地解决我的第三个algo语句

    任何帮助都将不胜感激

    没有太多的时间去检查,但可能看起来像那样

    public static String solve(String startWord, String givenWord) {
        for(int i = 0; i < startWord.length(); i++) {
            String letter = startWord.substring(i, i + 1);
            int index = givenWord.indexOf(letter);
            if(index == -1) {
                return "NO";
            } else {
                givenWord = givenWord.substring(index + 1, givenWord.length());
            }
        }
    
        return "YES";
    }
    
    publicstaticstringsolve(stringstartword,stringgivenword){
    对于(int i=0;i
    您可以使用正则表达式来解决问题:

    static String hackerrankInString(String input) {
        final String regexHack = ".*h.*a.*c.*k.*e.*r.*r.*a.*n.*k.*";
        return input.matches(regexHack) ? "YES" : "NO";
    }
    
    使用以下命令调用它:

    System.out.println(hackerrankInString("hhaacckkekraraannk"));  // YES
    System.out.println(hackerrankInString("hackerworld"));         // NO
    

    您可以试用regex。

    我发现这个解决方案很合适,但因为我不知道它是如何工作的。你能描述一下这部作品吗?我需要学习这项技术,从长远来看,它肯定会对我有所帮助。如果你点击链接,你会在右边看到关于正则表达式的解释。你是在问regex是如何工作的,还是解决方案是如何与regex一起工作的?我在问Nicholas。它只是一个模拟器或在线正则表达式检查器。我真的需要了解这些东西。我应该开始学习正则表达式吗?正则表达式总是很有用的。在这个答案中,我们检查输入字符串是否与正则表达式匹配。在外行术语中,正则表达式只是确保字符串至少包含
    hackerrank
    。如果为true,则返回“YES”,否则返回“FALSE”。
    *
    匹配位于
    h
    a
    c
    n
    k
    ,表示每个字母表之间可以有任意数量的字符。您可以在答案的链接中使用正则表达式。
    System.out.println(hackerrankInString("hhaacckkekraraannk"));  // YES
    System.out.println(hackerrankInString("hackerworld"));         // NO