14. Longest Common Prefix
Write a function to find the longest common prefix string amongst an array of strings.
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
}
};
解题思路:
-
自己的解题思路(纵向)
依次比较每个字符串的相同序号的字符,如果都相同,比较下一个;如果不同,跳出循环。
-
别人的解题思路(横向)
思路:每两个字符串找出最长的公共子串,然后得出最长的公共子串。
学习收获:
-
再次熟悉 substr(pos,len=npos) , len==0 也是可能的。
附件:程序
1
、自己的程序:
class
Solution
{
public
:
string
longestCommonPrefix
(
vector
<
string
>&
strs
)
{
int
n
=
strs
.
size
();
if
(
n
==
0
)
return
{};
string
res
;
int
min
=
INT_MAX
;
for
(
int
i
=
0
;
i
!=
n
;
++
i
)
{
min
=
int
((
strs
.
begin
()
+
i
)->
size
())
<
min
?
int
((
strs
.
begin
()
+
i
)->
size
()):
min
;
}
for
(
int
i
=
0
;
i
<
min
;
++
i
)
{
int
j
=
1
;
for
(;
j
<
n
;
++
j
)
{
if
(
strs
[
j
-
1
][
i
]
!=
strs
[
j
][
i
])
{
break
;
}
}
if
(
j
<
n
)
{
break
;
}
else
{
res
.
push_back
(
strs
[
0
][
i
]);
}
}
return
res
;
}
};
自己改进版,速度有所提升。
去掉临时存储字符串的
res
,因为只需要最后一次取出就行。
class
Solution
{
public
:
string
longestCommonPrefix
(
vector
<
string
>&
strs
)
{
int
n
=
strs
.
size
();
if
(
n
==
0
)
return
{};
int
min
=
INT_MAX
;
for
(
int
i
=
0
;
i
!=
n
;
++
i
)
{
min
=
int
((
strs
.
begin
()
+
i
)->
size
())
<
min
?
int
((
strs
.
begin
()
+
i
)->
size
()):
min
;
}
int
i
=
0
;
for
(;
i
<
min
;
++
i
)
{
int
j
=
1
;
for
(;
j
<
n
;
++
j
)
{
if
(
strs
[
j
-
1
][
i
]
!=
strs
[
j
][
i
])
{
break
;
}
}
if
(
j
<
n
)
{
break
;
}
}
return strs[0].substr(0, i);
}
};
2
、别人的程序
class
Solution
{
public
:
string
longestCommonPrefix
(
vector
<
string
>
&
strs
)
{
if
(
strs
.
empty
())
return
""
;
int
right_most
=
strs
[
0
].
size
()
-
1
;
for
(
size_t
i
=
1
;
i
<
strs
.
size
();
i
++)
for
(
int
j
=
0
;
j
<=
right_most
;
j
++)
if
(
strs
[
i
][
j
]
!=
strs
[
0
][
j
])
right_most
=
j
-
1
;
return
strs
[
0
].
substr
(
0
,
right_most
+
1
);
}
};