开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天,点击查看活动详情
题目 leetcode.cn/
- 给你一个字符串
s和一个字符串数组words,请你判断s是否为words的 前缀字符串 。 - 字符串
s要成为words的 前缀字符串 ,需要满足:s可以由words中的前k(k为 正数 )个字符串按顺序相连得到,且k不超过words.length。 - 如果
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
- 解释:数组的前缀相连无法得到 s 。
提示:
1 <= words.length <= 1001 <= words[i].length <= 201 <= s.length <= 1000words[i]和s仅由小写英文字母组成
代码
function isPrefixString(s: string, words: string[]): boolean {
let str = words.join('');
if(str.length < s.length) return false;
for(let i = 0; i < s.length; i++){
if(s[i] !== str[i]){
return false
}
}
return true;
};
-
刚开始想的是:先通过拼接字符串将所有的单词拼接成字符串
- 如果所有单词拼接起来的字符串都小于原来的字符串,那么直接返回
false - 否则遍历整个原有的字符串,将给定的字符串和拼接后的字符串中的字符串逐个比较是否相等。如果都一一对应上了,就返回
true,有一个对不上就返回false
- 如果所有单词拼接起来的字符串都小于原来的字符串,那么直接返回
-
结果:报错了,因为数组的第一个单词是
aa,而字符串是a,无法通过完整单词校验 -
修改版:
function isPrefixString(s: string, words: string[]): boolean {
let strs = words.join('');
if(strs.length < s.length) return false;
let str = '';
for(let i = 0; i < words.length; i++){
str += words[i];
if(str.length <= s.length){
let word = s.substring(0, str.length);
if(word !== str){
return false;
}
if(word === s){
return true;
}
} else {
return false;
}
}
};
- 首先上面判断整个字符串长度的逻辑还是需要,会出现所有单词加在一起都没有字符串长度长的这一种情况。
- 然后,遍历整个数组,每次从数组中取出一个单词,都拼接起来,然后再按照这个字符串的长度去原字符串去取出同样长度的字符串比较
- 如果两个字符串不相等,那么说明不能通过前
i个单词拼接成原字符串,直接返回false - 如果最后拼接起来的字符串长度等于字符串长度且相等,那么是符合通过前
i个单词拼接成原字符串的,返回true
- 如果两个字符串不相等,那么说明不能通过前
- 这里外面还加了一层字符串长度的判断
- 如果前面
i个单词拼接的字符串和原字符串取出来的子字符串相等,但是拼接第i+1时,拼接字符串长度大于原字符串了,这样是不符合要求的,返回false - 只有当拼接后长度小于等于原字符串时才走上面逻辑
- 如果前面