顺序比较字符串

14. 题目链接-来源:力扣(LeetCode)(简单)

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。

示例 1:

输入:strs = [“flower”,”flow”,”flight”]
输出:”fl”

思路:

这题的解法形象地理解就是给你并排放几根烤串,你拿一根签子垂直这些烤串,一排排把东西划下来。第一排全是豆腐,第二排全是鸡柳,第三排全是板筋,第四排,出现不一样的了有骨肉相连、有蚕蛹,那么前三排一样的部分『豆腐』、『鸡柳』、『板筋』就是所求的公共前缀。这种解法可以称之为『垂直遍历』或者『横向遍历』或者随便什么名字。
与之相对应的就是『平行遍历』,先遍历记录第一串,再遍历对比第二串,发现到不同之处就截停,丢弃余下部分,只保留相同部分,继续比对。
时间复杂度:O(nm) n是字符串个数,m是公共前缀长度。但实际上如果第一串字符串是最长的,第二种方法仍然会把它遍历完,但是多出来的部分不影响mn的数量级就是了。
空间复杂度:O(m+n)(垂直遍历) O(m)(平行遍历)

实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class Solution {
class ListNode {
char key;
ListNode next;
ListNode(char c) {
key = c;
next = null;
}
}

public String longestCommonPrefix(String[] strs) {
int n = strs.length;
ListNode trie = new ListNode(' ');

String s = strs[0];
int len = s.length();
ListNode cur = trie;
for (int i = 0; i < len; i++) {
cur.next = new ListNode(s.charAt(i));
cur = cur.next;
}

for (int i = 1; i < n; i++) {
cur = trie;
s = strs[i];
len = s.length();
if (len == 0) {
trie.next = null;
}
for (int j = 0; j < len; j++) {
if (cur.next != null && cur.next.key == s.charAt(j)) {
cur = cur.next;
if (j >= len - 1) {
cur.next = null;
}
} else {
cur.next = null;
break;
}
}
}

StringBuilder sb = new StringBuilder();
for (cur = trie.next; cur != null; cur = cur.next) {
sb.append(cur.key);
}

return sb.toString();
}
}