leetcode14 最长公共前缀(C#)

题目

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。

示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”

示例 2:
输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。

说明:
所有输入只包含小写字母 a-z 。

解题

解法一:暴力法
暴力法的思路很简单,令第一个字符串为公共前缀(ans),后面的字符串与ans依次比较,得出公共前缀。这种方法无论前缀多短,都要遍历到最后一个字符串(例如 [“dog”,“door”,“car”] ,ans=”dog“,
”car“与ans没有公共前缀,但 ” car“ 之前的字符串仍要与ans比对),做了很多无用功。

解法二:纵向比较
纵向比较的思想是先比对每个字符串的第 i 个字符,如果相同就继续比对,如果不同就返回结果。
如下,每个字符串第一个字符分别为 d,d,c,三个字符不全相同,所以直接返回结果。减去了多余的遍历。
d o o r
d o g
c a r

public string LongestCommonPrefix(string[] strs) {
        if (strs.Length == 0 || strs[0] == "") return "";
            string com = strs[0];//初始化第一个字符串为比对对象
            int len = strs.Length;//字符串组长度
            int clen = com.Length;//第一个字符串长度
            for(int i = 0; i < clen; i++)//遍历每个字符
            {
                char c = com[i];
                for(int j = 1; j < len; j++)//遍历除第一个字符串外的字符串(因为不用与自己比对)
                {
                    string temp = strs[j];
                    if (i == strs[j].Length || temp[i] != c) return com.Substring(0, i);//如果i到达了比对对象的最后一个字符,返回结果,否则会超过范围
                }
            }
            return com;
    }

需要注意的点:
结束循环的条件有两个:
1.当遍历到两个字符串中较短的字符串的末尾时,要结束循环,不然会超出索引范围;
2.当字符不同时,结束循环。
一开始我打算用stringbuilder来存储结果,但是有点弄巧成拙的感觉,因为stringbuilder需要判断到一个相同的字符时进行添加,而添加的条件是当遍历完全部字符串的某位字符且他们都相同。然后参考了别的解答,直接在跳出循环时截取目前遍历到的字符串就可得到答案,比stringbuilder方案简洁的多。看来还是需要多训练思维。

参考:https://leetcode-cn.com/problems/longest-common-prefix/solution/zui-chang-gong-gong-qian-zhui-by-leetcode/

https://leetcode-cn.com/problems/longest-common-prefix/solution/hua-jie-suan-fa-14-zui-chang-gong-gong-qian-zhui-b/

你可能感兴趣的:(算法)