Easy
题目描述
给你一个字符串 s 和一个字符串数组 words,请你判断 s 是否为 words 的 前缀字符串。
字符串 s 是 words 的 前缀字符串,当且仅当 s 可以由 words 中的前 k(k 为 正数)个字符串按顺序相连得到。
如果 s 是 words 的前缀字符串,返回 true;否则,返回 false。
示例 1:
输入:s = "iloveleetcode", words = ["i","love","leetcode","apples"]
输出:true
解释:
s 可以由 "i"、"love" 和 "leetcode" 相连得到。
示例 2:
输入:s = "iloveleetcode", words = ["apples","i","love","leetcode"]
输出:false
解释:
无法用 words 的前缀来构成 s。
提示:
1 <= words.length <= 1001 <= words[i].length <= 201 <= s.length <= 1000words[i]和s仅由小写英文字母组成
解题思路
解题思路
这道题要求判断字符串 s 是否可以由数组 words 的前 k 个字符串按顺序拼接而成。
核心思路:
- 从
words数组的第一个元素开始,依次拼接字符串 - 每次拼接后检查当前拼接结果是否与目标字符串
s匹配 - 如果某次拼接后的长度超过了
s的长度,或者内容不匹配,则返回false - 如果拼接结果恰好等于
s,则返回true
算法步骤:
- 初始化一个空字符串
prefix用于存储拼接结果 - 遍历
words数组,逐个拼接字符串到prefix - 每次拼接后,检查
prefix是否为s的前缀 - 如果
prefix长度超过s,或者不是s的前缀,返回false - 如果
prefix等于s,返回true - 如果遍历完所有单词都没有找到匹配,返回
false
时间复杂度为 O(n),其中 n 是字符串 s 的长度,空间复杂度为 O(n)。
代码实现
class Solution {
public:
bool isPrefixString(string s, vector<string>& words) {
string prefix = "";
for (const string& word : words) {
prefix += word;
if (prefix.length() > s.length()) {
return false;
}
if (prefix == s) {
return true;
}
if (s.substr(0, prefix.length()) != prefix) {
return false;
}
}
return false;
}
};
class Solution:
def isPrefixString(self, s: str, words: List[str]) -> bool:
prefix = ""
for word in words:
prefix += word
if len(prefix) > len(s):
return False
if prefix == s:
return True
if not s.startswith(prefix):
return False
return False
public class Solution {
public bool IsPrefixString(string s, string[] words) {
string prefix = "";
foreach (string word in words) {
prefix += word;
if (prefix.Length > s.Length) {
return false;
}
if (prefix == s) {
return true;
}
if (!s.StartsWith(prefix)) {
return false;
}
}
return false;
}
}
/**
* @param {string} s
* @param {string[]} words
* @return {boolean}
*/
var isPrefixString = function(s, words) {
let concat = "";
for (let i = 0; i < words.length; i++) {
concat += words[i];
if (concat === s) {
return true;
}
if (concat.length > s.length) {
return false;
}
}
return false;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | n 为字符串 s 的长度,最多需要遍历一遍 s |
| 空间复杂度 | O(n) | 需要额外空间存储拼接的前缀字符串 |