Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Searching if String differs by one character

I'm trying to determine if a word entered differs by one character in a text file. I have code that works, but unfortunately only for words that are two characters or less which obviously isn't very useful, and the code itself looks a bit messy. Here's what I have so far:

if(random.length() == word.length()){
  for(int i = 0; i < random.length(); i++){
    if( (word.charAt(i) == random.charAt(i))){
      str += word+"\n"; 
      count++;
    }
  }
 }  

With random being the word that was entered by the user, and word being the word to search for in the text file.

If I changed my second if statement to something along the lines of

if( (word.charAt(i) == random.charAt(i)) && (word.charAt(i -1) == random.charAt(i-1)))

and if I change int i to be = 1 instead, I seem to get more of what I'm looking to accomplish, but then my code is searching for only if the first two letters are the same and not if the last two are as well, which it should be doing.

like image 898
user180708 Avatar asked Nov 28 '14 21:11

user180708


2 Answers

I assume you need a function like this? I just wrote and tested it.

static boolean equals(String word1, String word2, int mistakesAllowed) {
    if(word1.equals(word2)) // if word1 equals word2, we can always return true
        return true;

    if(word1.length() == word2.length()) { // if word1 is as long as word 2
        for(int i = 0; i < word1.length(); i++) { // go from first to last character index the words
            if(word1.charAt(i) != word2.charAt(i)) { // if this character from word 1 does not equal the character from word 2
                mistakesAllowed--; // reduce one mistake allowed
                if(mistakesAllowed < 0) { // and if you have more mistakes than allowed
                    return false; // return false
                }
            }
        }
    }

    return true;
}
like image 103
luuksen Avatar answered Oct 08 '22 23:10

luuksen


Your code seems to be working to me, you just may be interpreting its results incorrectly.

This may be more obvious:

int count = 0;     if(random.length() == word.length()) {
for(int i = 0; i < random.length(); i++)
{
    if( (word.charAt(i) != random.charAt(i) ))
    {
        if(count == 0)
        {
            System.out.println("Found first difference!");
        }
        if(count != 0)
        {
            System.out.println("Strings are more than one letter different!");
        }
        count++;
    }
} }

If you want to check Strings of different lengths, you'll need to delete characters from the longer one until it's the same size as the shorter. For example: If String1 = "abc"; and String2 = "zzzabcdef";

You'll need to delete 6 characters from the second string and test for every combination of 6 characters deleted. So you would want to test the strings: def, cde, abc, zab, zza, zzz, zzb, zzc, zzd, zze, zzf, zaf, zae, zad, zac, zab, zza, zzf, zze, ..., ..., on and on, the list is of size 9 choose 6, so it's definitely not optimal or recommended.

You can however, check to see if a string which is one character longer than the other is just the other string with one added letter. To do this, you want a for loop to grab two substring from 0 to i, and from i+1 to the end. This will leave out the ith character, and looping for the size of the string - 1, will give you first the full string, then the string without the first letter, then missing the second letter, and so on. Then test that substring in the same fashion we did above.

Comment if this was not what you're looking for.

EDIT

To see how many words in a file are one letter different than a variable word, you need to loop through the file, getting each word. Then testing if that was string was one letter off. It would be something like this:

String testAgainst = "lookingForWordsOneLetterDifferentThanThisString";
int words = 0;

Scanner scan = new Scanner(fileName);

while(scan.hasNext())
{
    String word = scan.next();
	
    if( isOneDifferent(word, testAgainst) )
    {
        words++;
    }

    System.out.println("Number of words one letter different: " + words);
}

public boolean isOneDifferent(String word, String testAgainst)
{
    if(word.length() != testAgainst.length())
    {
        return false;
    }

    int diffs = 0;

    for(int i = 0; i < word.length(); i++)
    {
        if(word.charAt(i) != testAgainst.charAt(i))
        {
            diffs++;
        }
		
        if(diffs > 1)
        {
            return false;
        }
    }

    if(diffs == 1)
    {
        return true;
    }
    else
    {
        return false;
    }

}
like image 22
Matt C Avatar answered Oct 08 '22 23:10

Matt C