最长公共前缀
题目描述
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。
示例 1:输入:strs = [“flower”,”flow”,”flight”]
输出:”fl”
示例 2:输入:strs = [“dog”,”racecar”,”car”]
输出:””
解释:输入不存在公共前缀。
题目分析
我的思路 for循环取出每个字符串
找出这些字符串中长度最小的一个 minLen,取出每个字符串的首字母 比较 。比较minLen次, 难点在于我不知道strs中有多少个字符串str,即使知道了也不能一次性把每个字符串str的首字母取出来比较。比如我有hashMap存储strs字符串数组,key—>是字符串str的下标strIndex,value—>char[]的,方便取出每个str的首字符
1 | HashMap <Integer,char[]> map = new HashMap(); |
关键是这个chhh每次遍历一遍字符串数组strs就有strLen个,而且这么多个chhh名字相同而值不同。
要是能让这些chhh带上标记(标记出这chhh是属于哪个字符串strs[j]的首字母),把每个str的chhh取出来,亦或。若每个chhh异或后=0,说明这个chhh是公共值。
在把每个str的第二个元素取出来chhh2,异或每个chhh2若chhh2=0,说明是公共值。一直循环minLen次。chhhh[i] ^= chhhh[i+1];若循环每个str的首字母chhh后,chhh=0 说明chhh是公共前缀。代码太复杂不会写了。wuwuwu
我的代码
1 | public static String longestCommonPrefix(String[] strs) { |
参考答案
1 | public String longestCommonPrefix(String[] strs) { |
参考代码的图解如下
对比总结
我的想法很直接,是取出strs中每个字符串的首字母,在把这些首字母异或。若异或的结果等于0,就表明这是公共元素。首先这种做法不合理。因为不能一次性把每个字符串的首字符取出来一起比较。只能两个字符串的同一个下标索引的值比较。
在看了参考代码后,我发现能用整体的思维比较【以每个字符串为单位,比较ans和strs[i],用j为下标记录2个字符串间第一次有差异的位置,截取下标j之间的公共部分,让ans重新指向这个公共部分。而strs[i]也同样指向下一个字符串。这样淘汰的是整个长度较大字符串】。而不是以每个字符为单位。
1 | // 发现参考答案的 |






