0

我刚来这地方。我正在 Leetcode 上尝试关于最长公共前缀的 C# 问题。我知道这个问题已经解决了很多次。我只是很难理解为什么我的代码在某些条件下不起作用。当输入 ["flower","flow","flight"] 被输入时,它工作得很好并得到输出 "fl"。但是,当我输入 ["ab", "a"] 时,我突然得到一个 IndexOutOfRangeException。有谁知道为什么?这是我的代码:

public class Solution {
public string LongestCommonPrefix(string[] strs) {

    StringBuilder sb = new StringBuilder();
    int h = 1;
    int count = 0; 
    
    if (strs.Length == 1){
        return strs[0];
    }
    
    for (int i = 0; i<strs[0].Length; i++)
    {
         if ((strs[0])[i].Equals((strs[h])[i])){
            count++;
             if (h<strs.Length-1){
                 h++;
             }
         }  
    }      
    
     for (int j = 0; j < count; j++)
     {
         sb.Append((strs[0])[j]);
     }               
   return sb.ToString();       
 }
}
4

2 回答 2

2

您可以通过在 Visual Studio 中制作一个简单的控制台应用程序来进行调试。我在您的代码中添加了 Console.Writeline(strs[0] + strs[h]) 以按原样演示逻辑。在调试中运行您的代码,您可以单步执行并查看引发异常的位置:

异常位置

请注意,控制台每次都打印相同的内容,并且 strs[h] 只有一个字符长。当您将 i 增加到 1 时,您正在尝试访问单元素数组的第二个元素。

于 2021-11-29T19:46:38.657 回答
1

当输入 ["flower","flow","flight"] 被输入时,它工作得很好并得到输出 "fl"。但是,当我输入 ["ab", "a"] 时,我突然得到一个 IndexOutOfRangeException。有谁知道为什么?

因为所写的算法循环直到i达到第一个字符串的长度,而不是最短的字符串。这对于花/流/飞行来说很好,因为所有这些字符串都会在i接近运行最短字符串的末尾之前找到公共前缀“fl”;当算法确定花中的o花与i飞行中的花不同时,i 为 2,因此代码不会超出范围。

在 ab/a 的情况下,i 是 1 并且算法尚未确定前缀已经发散,您尝试访问字符串“a”上不存在的索引 1 并发生崩溃

正如评论所指出的,您的 h 逻辑也有问题;h 应该在 i 循环内从 1 开始循环。因为它现在 h 只是增加到 strings-1 的数量并保持在那里,所以本质上你最终只在第一个和最后一个字符串中寻找前缀。如果您的字符串是flower/flight/float/flowing/flowers,您将声明前缀为“flower”,因为仅在 i 分别为 0、1 和 2 时才会考虑飞行/浮动/流动

我建议你用你认为的语言在评论中写出算法,然后尝试把它变成 c#

于 2021-11-29T19:53:42.170 回答