我编写了单词搜索问题的代码,我们需要搜索并获取N * N网格中特定单词的出现次数。我需要一些建议来改进此代码,以获得更好的性能。
可以在两个方向上水平,垂直和对角搜索单词
代码是:
TypeError: Object.keys called on non-object
我想减少循环次数。除此之外,有人可以建议我如何处理重叠场景。例如,在5 * 5中,第一行值为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();
,而要搜索的单词为ASKSA
。在这种情况下,ASK
是重叠的字符。
答案 0 :(得分:0)
您的代码在某些方面有点难以阅读(通用/非描述变量名称,没有评论),但我看到了一些需要改进的地方。请注意,有时编写清晰的代码而不是优化性能更为重要。
首先,我不认为您的代码适用于所有情况。例如,如果字符串ASKASK
出现在一行中,则当有ASK
个时,计数会加1。
其次,你可以为像RACECAR
这样的回文添加优化,其反面是同一个词。
正如目前所写,你可以摆脱的唯一循环是对角循环。您需要添加int j = finalArr[i]-1-i;
,以便可以在
// Loop for horizontal and vertical count
for (int i = 0; i < finalArr.length; i++) {
话虽这么说,你可以稍微重写代码以提高效率。例如,在10x10拼图中,如果单词EFFICIENT
在一行中,则字母E
将是第一个或第二个字符。 (您还知道T
将是包含EFFICIENT
反向的行中的第一个或第二个字符。)