在字符串中查找子序列:Java

时间:2018-06-19 03:53:30

标签: java string algorithm data-structures

我有一个字符串hackkkerrank,我必须找到是否有任何 子序列 给出hackerrank的结果,如果它存在,那么它结果为YES,否则为NO

样品:

hereiamstackerrank: YES
hackerworld: NO

我不知道应该应用哪种String方法,有人可以帮我怎么做吗?

这是我的代码:

static String hackerrankInString(String s) {
  char str[] = {
   'h','a','c','k','e','r','a','n','k'
  };
 while (s.length() >= 10) {
  for (int i = 0; i < s.length(); i++) {
   for (char c: str) {
    if (s.indexOf(c)) {
     System.out.println("YES");
    } else {
     System.out.println("NO");
    }
   }
  }
 }
}

4 个答案:

答案 0 :(得分:2)

这是一种内置方式,使用正则表达式:

String regex = "[^h]*+h[^a]*+a[^c]*+c[^k]*+k[^e]*+e[^r]*+r[^r]*+r[^a]*+a[^n]*+n[^k]*+k.*";
System.out.println("hereiamstackerrank".matches(regex) ? "YES" : "NO");
System.out.println("hackerworld".matches(regex) ? "YES" : "NO");

输出

YES
NO

您可以使用通用方法检查子序列,如下所示:

public static boolean containsSubsequence(String subsequence, String text) {
    StringBuilder buf = new StringBuilder();
    for (int i = 0, j; i < subsequence.length(); i = j) {
        j = subsequence.offsetByCodePoints(i, 1);
        String ch = Pattern.quote(subsequence.substring(i, j));
        buf.append("[^").append(ch).append("]*+").append(ch);
    }
    String regex = buf.append(".*").toString();
    return text.matches(regex);
}

测试

System.out.println(containsSubsequence("hackerrank", "hereiamstackerrank") ? "YES" : "NO");
System.out.println(containsSubsequence("hackerrank", "hackerworld") ? "YES" : "NO");

输出

YES
NO

当然,效率不高,但这是一种方法。

对于一个更简单,更有效的解决方案,它不处理Supplement­ary Planes中的字符,你可以这样做:

public static boolean containsSubsequence(String subsequence, String text) {
    int j = 0;
    for (int i = 0; i < text.length() && j < subsequence.length(); i++)
        if (text.charAt(i) == subsequence.charAt(j))
            j++;
    return (j == subsequence.length());
}

答案 1 :(得分:1)

这是一种老式的循环方式,它根据找到最后一个字符的位置递增第二个字符串的起始位置

    String str1 = "hackerrank";
    String str2 = "hereiamstackerrank";

    int index = 0;

    for (int i = 0; i < str1.length(); i++) 
    {
        boolean notfound = true;
        int x = index;
        for (; x < str2.length(); x++) {
            if (str1.charAt(i) == str2.charAt(x)) {
                notfound = false;
                break;
            }
        }
        if (notfound) {
            System.out.println("NO");
            return;
        }
        index = x + 1;
    }
    System.out.println("YES");

无效的替代方案是

    for (int i = 0; str1.length() > 0 && i < str2.length(); i++) 
    {
        if (str1.charAt(0) == str2.charAt(i)) {
            str1 = str1.substring(1);
        }
    }
    System.out.println(str1.length() == 0 ? "YES" : "NO");

答案 2 :(得分:0)

static String re="";
    static String hackerrankInString(String s) {
        String pattern="[^h]*+h[^a]*+a[^c]*+c[^k]*+k[^e]*+e[^r]*+r[^r]*+r[^a]*+a[^n]*+n[^k]*+k.*";
        if(s.matches(pattern)){
            re="YES";
        }else{
            re="NO";
        }
        return re;
    }

答案 3 :(得分:-2)

核心库中没有内置函数来检查subsequencesubstring有一个,但{id}}找不到subsequence

您必须自己编写代码

以下是伪代码:

1. Traverse both original string and string under test. 
2. Increment both's counter if characters are equal
3. Else increment originalString's counter only.
4. Repeat 2-3 `while` both strings are `not` empty. 
5. Given string under test is subsequence if its counter is exhausted.