LC14.LongestCommonPrefix


题目

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

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

示例 1:

输入:strs = ["flower", "flow", "flight"]
输出:"fl"
示例 2:

输入:strs = ["dog", "racecar", "car"]
输出:""
解释:输入不存在公共前缀。

提示:

1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 如果非空,则仅由小写英文字母组成

题解

#include <iostream>
#include <vector>
#include <algorithm>
//Solution1:横向扫描
class Solution_1
{
public:
	std::string longestCommonPrefix(std::vector<std::string>& strs)
	{
		if (!strs.size()) return "";
		std::string prefix = strs[0];
		int count = strs.size();
		for (int i = 1; i < count; ++i)
		{
			prefix = longestCommonPrefix(prefix, strs[i]);
			if (!prefix.size()) break;
		}
		return prefix;
	}
	std::string longestCommonPrefix(const std::string& str1, const std::string& str2)
	{
		int length = std::min(str1.size(), str2.size());
		int index = 0;
		while (index < length && str1[index] == str2[index])
		{
			++index;
		}
		return str1.substr(0, index);
	}
};

//Solution2:横向扫描
class Solution_2
{
public:
	std::string longestCommonPrefix(std::vector<std::string>& strs)
	{
		if (!strs.size()) return "";
		int length = strs[0].size();
		int count = strs.size();
		for (int i = 0; i < count; ++i)
		{
			char c = strs[0][i];
			for (int j = 1; j < count; ++j)
			{
				if (i == strs[j].size() || strs[j][i] != c)
					return strs[0].substr(0, i);
			}
		}
		return strs[0];
	}
};

//Solution3:分治
class Solution_3
{
public:
	std::string longestCommonPrefix(std::vector<std::string>& strs)
	{
		if (!strs.size()) return "";
		else return longestCommonPrefix(strs, 0, strs.size() - 1);
	}

	std::string longestCommonPrefix(const std::vector<std::string>& strs, int start, int end)
	{
		if (start == end) return strs[start];
		else
		{
			int mid = (start + end) / 2;
			std::string lcpLeft = longestCommonPrefix(strs, start, mid);
			std::string lcpRight = longestCommonPrefix(strs, mid + 1, end);
			return commonPrefix(lcpLeft, lcpRight);
		}
	}

	std::string commonPrefix(const std::string& lcpLeft, const std::string& lcpRight)
	{
		int minLength = std::min(lcpLeft.size(), lcpRight.size());
		for (int i = 0; i < minLength; ++i)
		{
			if (lcpLeft[i] != lcpRight[i]) return lcpLeft.substr(0, i);
		}
		return lcpLeft.substr(0, minLength);
	}
};

//Solution4:二分查找
class Solution_4
{
public:
	std::string longestCommonPrefix(std::vector<std::string>& strs)
	{
		if (!strs.size()) return "";
		int minLength = std::min_element(strs.begin(), strs.end(), [](const std::string& s, const std::string& t) {return s.size() < t.size(); })->size();
		int low = 0, high = minLength;
		while (low < high)
		{
			int mid = (high - low + 1) / 2 + low;
			if (isCommonPrefix(strs, mid)) low = mid;
			else high = mid - 1;
		}
		return strs[0].substr(0, low);

	}

	bool isCommonPrefix(const std::vector<std::string>& strs, int length)
	{
		std::string str0 = strs[0].substr(0, length);
		int count = strs.size();
		for (int i = 1; i < count; ++i)
		{
			std::string str = strs[i];
			for (int j = 0; j < length; ++j)
			{
				if (str0[j] != str[j]) return false;
			}
		}
		return true;
	}
};
//Solution5:sort排序后比较首尾
class Solution_5
{
	std::string longestCommonPrefix(std::vector<std::string>& strs)
	{
		std::sort(strs.begin(), strs.end());
		std::string ans = "";
		for (int i = 0; i < strs[0].size() && i < strs[strs.size() - 1].size(); ++i)
		{
			if (strs[0][i] == strs[strs.size() - 1][i]) ans += strs[0][i];
			else break;
		}
		return ans;
	}
};