java算法 字符组合排序,java字符串排列和组合查找

我正在编写一个 Android

word应用程序。我的代码包含一个方法,该方法将查找字符串和7个字母的字符串的子字符串的所有组合,且其最小长度为3。然后将所有可用组合与字典中的每个单词进行比较,以找到所有有效单词。我正在使用递归方法。这是代码。

// Gets all the permutations of a string.

void permuteString(String beginningString, String endingString) {

if (endingString.length() <= 1){

if((Arrays.binarySearch(mDictionary, beginningString.toLowerCase() + endingString.toLowerCase())) >= 0){

mWordSet.add(beginningString + endingString);

}

}

else

for (int i = 0; i < endingString.length(); i++) {

String newString = endingString.substring(0, i) + endingString.substring(i + 1);

permuteString(beginningString + endingString.charAt(i), newString);

}

}

// Get the combinations of the sub-strings. Minimum 3 letter combinations

void subStrings(String s){

String newString = "";

if(s.length() > 3){

for(int x = 0; x < s.length(); x++){

newString = removeCharAt(x, s);

permuteString("", newString);

subStrings(newString);

}

}

}

上面的代码运行正常,但是当我将其安装在Nexus上时,我意识到它的运行速度太慢了。这需要几秒钟才能完成。大约3或4秒,这是不可接受的。现在,我在手机上玩了一些文字游戏,它们可以立即计算出字符串的所有组合,这使我相信我的算法不是很有效,可以改进。有人可以帮忙吗?

public class TrieNode {

TrieNode a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z;

TrieNode[] children = {a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z};

private ArrayList words = new ArrayList();

public void addWord(String word){

words.add(word);

}

public ArrayList getWords(){

return words;

}

}

public class Trie {

static String myWord;

static String myLetters = "afinnrty";

static char[] myChars;

static Sort sort;

static TrieNode myNode = new TrieNode();

static TrieNode currentNode;

static int y = 0;

static ArrayList availableWords = new ArrayList();

public static void main(String[] args) {

readWords();

getPermutations();

}

public static void getPermutations(){

currentNode = myNode;

for(int x = 0; x < myLetters.length(); x++){

if(currentNode.children[myLetters.charAt(x) - 'a'] != null){

//availableWords.addAll(currentNode.getWords());

currentNode = currentNode.children[myLetters.charAt(x) - 'a'];

System.out.println(currentNode.getWords() + "" + myLetters.charAt(x));

}

}

//System.out.println(availableWords);

}

public static void readWords(){

try {

BufferedReader in = new BufferedReader(new FileReader("c://scrabbledictionary.txt"));

String str;

while ((str = in.readLine()) != null) {

myWord = str;

myChars = str.toCharArray();

sort = new Sort(myChars);

insert(myNode, myChars, 0);

}

in.close();

} catch (IOException e) {

}

}

public static void insert(TrieNode node, char[] myChars, int x){

if(x >= myChars.length){

node.addWord(myWord);

//System.out.println(node.getWords()+""+y);

y++;

return;

}

if(node.children[myChars[x]-'a'] == null){

insert(node.children[myChars[x]-'a'] = new TrieNode(), myChars, x=x+1);

}else{

insert(node.children[myChars[x]-'a'], myChars, x=x+1);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值