【问题标题】:Find Subsequence in a String在字符串中查找子序列
【发布时间】:2019-04-06 08:59:46
【问题描述】:

我一直在 Hackerrank 上解决这组挑战,链接:Hackerrank in a String

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

  1. 根据hackerrank字符串检查是否至少有两个a、r和k
  2. 检查它是否包含以下字符 h、a、c、k、e、r、n、k
  3. 设 p[0], p(1), p[2].....,p[9] 分别为 h, a, c, k, e, r, r, a, n 的索引, k 在字符串中。如果 p[0]

我知道很糟糕,由于这个错误,输出也没有出现:Terminated due to timeout

代码:

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

// Complete the hackerrankInString function below.
static String hackerrankInString(String s) {
  int countR = 0, countA = 0, countK = 0;
  //for reading multi-line inputs, it will perform operation individually 
  // on the inputs
  while(scanner.hasNextLine()){
    for(int i=0; i < s.length(); i++){
      if(s.charAt(i) == 'r')
        countR++;

      if(s.charAt(i) == 'a')
        countA++;

      if(s.charAt(i) == 'k')
        countK++;
    }

    //It should atleast have two As, two Rs, and two Ks
    if(countR >= 2 && countA >= 2 && countK >= 2){
      //If the string contains hackerrank
      if(s.contains(Character.toString('h')) && s.contains(Character.toString('a'))  && s.contains(Character.toString('c')) && s.contains(Character.toString('k')) && s.contains(Character.toString('e')) && s.contains(Character.toString('r')) &&    s.contains(Character.toString('n'))){
          if((s.indexOf('h') > s.indexOf('a')) && (s.indexOf('h') > s.indexOf('c')) && (s.indexOf('h') > s.indexOf('k')) && (s.indexOf('h') > s.indexOf('e')) && (s.indexOf('h') > s.indexOf('r')) && (s.indexOf('h') > s.lastIndexOf('r')) && (s.indexOf('h') > s.lastIndexOf('a')) && (s.indexOf('h') > s.indexOf('n')) && (s.indexOf('h') > s.lastIndexOf('k'))){
              if((s.indexOf('a') > s.indexOf('c')) && (s.indexOf('a') > s.indexOf('k')) && (s.indexOf('a') > s.indexOf('e')) && (s.indexOf('a') > s.indexOf('r')) && (s.indexOf('a') > s.lastIndexOf('r')) && (s.indexOf('a') > s.lastIndexOf('a')) && (s.indexOf('a') > s.indexOf('n')) && (s.indexOf('a') > s.lastIndexOf('k'))){
                  if((s.indexOf('c') > s.indexOf('k')) && (s.indexOf('c') > s.indexOf('e')) && (s.indexOf('c') > s.indexOf('r')) && (s.indexOf('c') > s.lastIndexOf('r')) && (s.indexOf('c') > s.lastIndexOf('a')) && (s.indexOf('c') > s.indexOf('n')) && (s.indexOf('c') > s.lastIndexOf('k'))){
                      if((s.indexOf('k') > s.indexOf('e')) && (s.indexOf('k') > s.indexOf('r')) && (s.indexOf('k') > s.lastIndexOf('r')) && (s.indexOf('k') > s.lastIndexOf('a')) && (s.indexOf('k') > s.indexOf('n')) && (s.indexOf('k') > s.lastIndexOf('k'))){
                        if((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'))){
                            if((s.indexOf('r') > s.lastIndexOf('r')) && (s.indexOf('r') > s.lastIndexOf('a')) && (s.indexOf('r') > s.indexOf('n')) && (s.indexOf('r') > s.lastIndexOf('k'))){
                                if((s.lastIndexOf('r') > s.lastIndexOf('a')) && (s.lastIndexOf('r') > s.indexOf('n')) && (s.lastIndexOf('r') > s.lastIndexOf('k'))){
                                    if((s.lastIndexOf('a') > s.indexOf('n')) && (s.lastIndexOf('a') > s.lastIndexOf('k'))){
                                        if(s.indexOf('n') > s.lastIndexOf('k')){
                                            return "YES";
                                        }
                                    }
                                }
                            }
                        }
                      }
                  }
              }
          }
        }
      }
    }

    return "NO";
}

请帮帮我,我想学两件事,

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

任何帮助将不胜感激。

【问题讨论】:

    标签: java character-encoding subsequence


    【解决方案1】:

    您可以使用正则表达式来解决问题:

    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
    

    你可以试试正则表达式here。

    【讨论】:

    • 我发现这个解决方案很合适,但因为我不知道它是如何工作的。能否请您描述一下这个作品?我需要学习这项技术,从长远来看,它肯定会对我有所帮助。
    • 如果您单击链接,您将在右侧获得正则表达式的解释。您是在询问 正则表达式的工作原理还是该解决方案如何与正则表达式一起工作?
    • 我问两个 Nicholas。 它只是一个模拟器或在线正则表达式检查器。我真的需要了解这些东西。我应该开始学习正则表达式吗?
    • 正则表达式总是有用的。在这个答案中,我们正在检查输入 String 是否与正则表达式匹配。用外行的话来说,正则表达式只是确保 your 字符串至少包含hackerrank。如果为真,则返回“YES”,否则返回“FALSE”。 .* 匹配介于 h、a、c..... n、k 之间的任何内容
    • 表示每个字母之间可以有任意个字符。您可以在答案链接中使用正则表达式。
    【解决方案2】:

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

    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";
    }
    

    【讨论】:

      猜你喜欢
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 2023-04-03
      • 2018-09-27
      • 2015-06-10
      相关资源
      最近更新 更多