package com.madeinhk.utils; import com.madeinhk.utils.arrayset.ArraySet; import java.util.Set; /** * Created by tonymak on 10/18/15. */ public class SimilarWordGenerator { private static final char[] ALPHABETS = "abcdefghijklmnopqrstuvwxyz".toCharArray(); public Set<String> generate(String source) { Set<String> generatedStrings = new ArraySet<>(); generateByDeleteAt(source, generatedStrings); generateByInsertAt(source, generatedStrings); generateByTransposition(source, generatedStrings); genereateBySubstitution(source, generatedStrings); return generatedStrings; } private void generateByDeleteAt(String source, Set<String> generatedStrings) { final int length = source.length(); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < length; i++) { stringBuilder.setLength(0); stringBuilder.append(source); String generatedString = stringBuilder.deleteCharAt(i).toString(); generatedStrings.add(generatedString); } } private void generateByInsertAt(String source, Set<String> generatedStrings) { final int length = source.length(); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < length; i++) { for (char alphabet : ALPHABETS) { stringBuilder.setLength(0); stringBuilder.append(source); String generatedString = stringBuilder.insert(i, alphabet).toString(); generatedStrings.add(generatedString); } } } private void genereateBySubstitution(String source, Set<String> generatedStrings) { final int length = source.length(); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < length; i++) { for (char alphabet : ALPHABETS) { stringBuilder.setLength(0); stringBuilder.append(source); stringBuilder.setCharAt(i, alphabet); generatedStrings.add(stringBuilder.toString()); } } } private void generateByTransposition(String source, Set<String> generatedStrings) { final int length = source.length(); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < length; i++) { for (int j = i + 1; j < length; j++) { stringBuilder.setLength(0); stringBuilder.append(source); char a = stringBuilder.charAt(i); stringBuilder.setCharAt(i, stringBuilder.charAt(j)); stringBuilder.setCharAt(j, a); generatedStrings.add(stringBuilder.toString()); } } } }