【发布时间】:2015-07-20 17:20:45
【问题描述】:
我已经为单词搜索问题编写了代码,我们需要在 N*N 网格中搜索并获取特定单词的出现次数。我需要一些建议来改进此代码,以获得更好的性能。
单词可以横向、纵向和对角双向搜索
代码是:
Scanner sc = new Scanner(System.in);
String size = sc.nextLine();
String finalArr[][] = new String[Integer.parseInt(size)][Integer.parseInt(size)];
int count = 0;
String diagonal1 = "", diagonal2 = "";
String arr[] = sc.nextLine().split(",");
// initializing array
for (int i = 0; i < arr.length; i++ ) {
String b[]= arr[i].split("#");
for (int j = 0; j < arr.length; j++) {
finalArr[i][j] = b[j];
}
}
StringBuilder searchWord = new StringBuilder(sc.nextLine());
// Loop for horizontal and vertical count
for (int i = 0; i < finalArr.length; i++) {
String horizontal = "";
String vertical = "";
for (int j = 0; j < finalArr.length; j++)
{
horizontal += finalArr[i][j];
vertical += finalArr[j][i];
}
if ( horizontal.contains(searchWord) ||
horizontal.contains(searchWord.reverse() ) )
count++;
if ( vertical.contains(searchWord) ||
vertical.contains(searchWord.reverse() ) )
count++;
}
//loop for one diagonal count
for (int i = 0; i < finalArr.length; i++ ) {
diagonal1 += finalArr[i][i];
}
//loop for another diagonal count
for ( int i = 0, j = finalArr[i].length - 1;
i < finalArr.length;
i++, j--) {
diagonal2+= finalArr[i][j];
}
if ( diagonal1.contains(searchWord) ||
diagonal1.contains(searchWord.reverse() ) )
count++;
if ( diagonal2.contains(searchWord) ||
diagonal2.contains(searchWord.reverse() ) )
count++;
System.out.println(count);
sc.close();
我想减少循环次数。除此之外,有人可以建议我如何处理重叠场景。例如,在 5*5 中,第一行值是 ASKSA,要搜索的单词是 ASK。在这种情况下,K 是重叠字符。
【问题讨论】:
-
如果你想考虑更简单的代码,同时高效,你应该改掉像
new String[Integer.parseInt(size)][Integer.parseInt(size)]那样重复代码的习惯;这不仅是更长的代码,而且还意味着工作两次。同样,不要在循环中一直来回搜索词reverse。只需将两种形式保存在两个字符串中,在循环之前创建。
标签: java algorithm performance