【问题标题】:Suggestion required for optimization of word search requirement优化词搜索需求的建议
【发布时间】: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


【解决方案1】:

您的代码在某些方面有点难以阅读(通用/非描述性变量名称,没有注释),但我看到了一些需要改进的地方。请注意,有时编写清晰的代码比优化性能更重要。

首先,我不认为您的代码适用于所有情况。例如,如果字符串ASKASK出现在一行中,当有2个ASKs时,计数加一。

其次,您可能会为回文添加优化,例如 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 反转的行中的第一个或第二个字符。)

【讨论】:

    猜你喜欢
    • 2011-04-04
    • 1970-01-01
    • 2019-06-15
    • 2015-06-04
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    相关资源
    最近更新 更多