我想到了一个函数,它将String类型的消息(例如:“hello”)作为输入,并检查字符串类型的随机字母(例如:“sdgjkahjkdghkjsaeasdflasfdo”),如果字母存在使得消息可以重建。
我的问题是我是否以及如何改进此算法以提高效率。
public static void main(String[] args) {
String letters = "asfhgsaihgaojmbpapojtnmaiuwbqapweqfbsjadsheeadsaslasfaslasasopz";
String message ="helloc";
System.out.println(seaOfLetters(message, letters));
}
public static boolean check(char[] a, char[] b) {
CHECK: for (int i = 0; i < a.length ; ++i) {
if (a[i] == b[i]) {
continue CHECK;
} else {
return false;
}
}
return true;
}
public static boolean seaOfLetters(String m, String l) {
char[] message = m.toCharArray();
char[] letters = l.toCharArray();
char[] newchar = new char[message.length];
for (int i = 0; i < message.length ; i++) {
CHECK: for (int j = 0; j < l.length() ; j++) {
if (message[i] == letters[j]) {
newchar[i] = message[i];
break CHECK;
}
}
}
return check(message, newchar);
答案 0 :(得分:1)
您可以分析算法以查看在最佳/最差情况下必须执行的操作数量,以尝试了解复杂性。
你也可以尝试运行它来获取一系列值并计算时间。在算法启动之前设置启动计时器的东西,并在完成后输出通过的时间。然后你可以运行它来增加集合的大小,看看时间如何变化,然后绘制它。确保为&#34; sea&#34;运行几个数量级(1,10,100,1000等)。和&#34;消息&#34;了解真正推动复杂性的因素。
要改进算法,可以考虑使用HashSet。它们具有O(1)复杂度,用于&#34;包含&#34;检查。所以你的程序基本上有两个步骤,1。添加&#34; sea&#34;到HashSet,然后2.迭代&#34;消息&#34;并查看字母是否在集合中。
答案 1 :(得分:0)
您可以使用字母长度的数组。
O(n + m)最坏的情况。
答案 2 :(得分:0)
使用正则表达式,您可以轻松地从源中删除目标中不存在的所有字母,从而为您提供更简单的解析文本:
letters.replaceAll ("[^"+message+"]", "")
"hhooeheello"
现在你仍然需要检查正确的字符数(两个 &#39; l&#39;)和正确的顺序。它有多快,我还没有测试过,但我想这第一步非常快。