检查给定字符串是否包含子字符串而不使用contains或indexOf方法

时间:2015-05-16 10:44:57

标签: java

在下面的代码中,我面临的问题是如何使内循环从给定的索引开始而不是每次都为0。

逻辑:

substr = rohan; 
mainstr = herohanda

代码首先使用substr的每个字符检查'r'的第一个字符,即mainstr,直到找到匹配为止。当找到匹配时,程序返回外部循环并递增i以检查substr的第二个charcater(即o)是否与下一个字符(索引旁边的字符)匹配'r'找到mainStr的匹配项的位置)。问题是如何从下一个字符开始内循环。这里每次都以初始索引(0)开始。

CODE:

public class SubstringInString {
   public static void isSubstring(String subStr, String mainStr){
         int flag = 0;
         int counter = 0;
        OUTER: for(int i = flag; i<subStr.length(); i = i+flag){
            INNER:  for(int j = 0; j< mainStr.length(); j=counter ){
                        if(subStr.charAt(i) == mainStr.charAt(j)){
                            counter++;
                            flag++;

                            continue OUTER;
                        }
                        else
                        {
                            if((mainStr.length() - i) >= subStr.length()){
                                counter ++;
                                flag = 0;

                                continue INNER;
                            }

                            else{
                                System.out.println("Main String does not contain the substring");
                            }
                        }
                    }
                }

            //  System.out.println("Match found at " + j-subStr.length());
        }
}

请告诉我如何解决这个问题,以及是否有更好的方法来解决这个问题。 提前致谢

3 个答案:

答案 0 :(得分:1)

从技术上讲,这解决了这个问题:

public static void isSubstring(String subStr, String mainStr){
    return mainStr.matches(".*\\Q" + subStr + "\\E.*");
}

答案 1 :(得分:1)

假设我们想知道s2是否是s1的子字符串。

有2个基本案例:

  1. s2的长度为0:在这种情况下,我们可以返回true
  2. s2的长度超过s1的长度:我们可以返回false
  3. 一般方法如下:遍历s1的每个字符,看它是否与s2的第一个字符匹配。如果是,请检查s1的其余字符是否与s2的其他字符匹配。如果是,请返回true。如果完全探索s1但未找到匹配项,请返回false

    以下是Java中的样子:

    static boolean isSubstring(String s1, String s2){
        int n1 = s1.length();
        int n2 = s2.length();
    
        if(n2 == 0)     // Base Case 1
            return true;
    
        if(n2 > n1)    // Base Case 2
            return false;
    
        for(int i = 0; i < s1.length(); i++)
            if(s1.charAt(i) == s2.charAt(0))        // if first char matches
                if(isRestMatch(i+1, s1, s2))       // check if rest match
                    return true;
    
        return false;
    }
    
    static boolean isRestMatch(int start, String s1, String s2){
        int n = s2.length();
        for(int i = start, x = 1; i < n; i++, x++)
            if(s1.charAt(i) != s2.charAt(x))
                return false;
    
        return true;
    }
    

答案 2 :(得分:0)

我找到了this Java implementation

public String strStr(String haystack, String needle) {

    int needleLen = needle.length();
    int haystackLen = haystack.length();

    if (needleLen == haystackLen && needleLen == 0)
        return "";

    if (needleLen == 0)
        return haystack;

    for (int i = 0; i < haystackLen; i++) {
        // make sure in boundary of needle
        if (haystackLen - i + 1 < needleLen)
            return null;

        int k = i;
        int j = 0;

        while (j < needleLen && k < haystackLen && needle.charAt(j) == haystack.charAt(k)) {
            j++;
            k++;
            if (j == needleLen)
                return haystack.substring(i);
        }

    }

    return null;
}