imbondbaby
imbondbaby

Reputation: 6411

Check if pattern exists in a String

I would like to check if a pattern exists in a String using iteration.

Here is what I have currently but I keep getting false as a result of it.

public static void main(String args[]) {
        String pattern = "abc";
        String letters = "abcdef";

        char[] patternArray = pattern.toCharArray();
        char[] lettersArray = letters.toCharArray();

        for(int i = patternArray.length - 1; i<= 2; i++){
            for(int j = lettersArray.length - 1; j <= 5;j++){
                if(patternArray[i] == lettersArray[j]){
                    System.out.println("true");
                } else{
                    System.out.println("false");
                }
            }
        }
    }

Basically I would like to check if abc exists in the String abcdef

Note: I don't want to use regex because is too easy. I am trying to find a solution without it because I am curious how to do it with iteration.

Upvotes: 3

Views: 1286

Answers (5)

ahitt6345
ahitt6345

Reputation: 510

public static Boolean patternFinder(String str, String pattern){
    for (int i = 0; i <= str.length()-pattern.length();i++){
        Boolean found = true;
        for (int f = 0; f < pattern.length();f++){
            if (pattern.charAt(f) != str.charAt(i+f)){
                found = false;
                break;
            }
        }
        if (found){
            return true;
        }
    }
    return false;
}

It's a very simple algorithm

basically, you loop through the string from the beginning and check if all the letters in the pattern are equal to the ones at that specific index.

Upvotes: 2

RockOnGom
RockOnGom

Reputation: 3961

If you want to get all matches, i use a list to save matches addresses in the string.

    String pattern = "abc";
    String letters = "defabcdefabc";
    int i = 0;
    List<Integer> matches = new ArrayList();
    while (i <= letters.length() - pattern.length()) {
        if (letters.substring(i, i + pattern.length()).equals(pattern))
            matches.add(i);
        i += 1;
    }

You can iterate matches if you want to loop all matches with this solution. Edit:language changed

Upvotes: 2

Enamul Hassan
Enamul Hassan

Reputation: 5445

Why not this:

public static void main(String args[]) {
    String pattern = "abc";
    String letters = "abcdef";

    char[] patternArray = pattern.toCharArray();
    char[] lettersArray = letters.toCharArray();
    boolean matched = false;
    for(int i = 0; i< lettersArray.length-patternArray.length && !matched; i++){
        for(int j = 0; j < patternArray.length;j++){
            if(patternArray[j] == lettersArray[i+j]&&j+1==patternArray.length){
                matched = true;
                System.out.println("true");
            }
            else if(i+1 == lettersArray.length-patternArray.length && j+1 == patternArray.length){
                System.out.println("false");
        }
    }
}

Upvotes: 1

xrisk
xrisk

Reputation: 3898

Here’s a naive string matching program that will find all matches of the pattern.

Not recommended for anything practical, because of the O(mn) time complexity (m and n are the lengths of the search string and pattern respectively).

class Potato 
{
    public static void main(String args[])
    {
        char[] search = "flow flow flow over me".toCharArray();
        char[] pattern = "flow".toCharArray();

        for(int i = 0; i <= search.length - pattern.length; i++)
          // `-` don't go till the end of the search str. and overflow
        {
            boolean flag = true;
            for(int j=0; j < pattern.length; j++) 
            {
                if(search[i + j] != pattern[j])
                {
                    flag = false;
                    break;
                }
            }
          if (flag)
                System.out.println("Match found at " + i);

        }
    }
}

Upvotes: 3

user2575725
user2575725

Reputation:

Problem is you have two loops for each array. Here, you need single loop to traverse in both array using same index.

Upvotes: 2

Related Questions