题目描述
给你一个字符串 sentence
作为句子并指定检索词为 searchWord
,其中句子由若干用 单个空格 分隔的单词组成。
请你检查检索词 searchWord
是否为句子 sentence
中任意单词的前缀。
- 如果
searchWord
是某一个单词的前缀,则返回句子sentence
中该单词所对应的下标(下标从 1 开始)。 - 如果
searchWord
是多个单词的前缀,则返回匹配的第一个单词的下标(最小下标)。 - 如果
searchWord
不是任何单词的前缀,则返回-1
。
字符串 S
的 前缀 是 S
的任何前导连续子字符串。
样例
输入:sentence = "i love eating burger", searchWord = "burg"
输出:4
解释:"burg" 是 "burger" 的前缀,而 "burger" 是句子中第 4 个单词。
输入:sentence = "this problem is an easy problem", searchWord = "pro"
输出:2
解释:"pro" 是 "problem" 的前缀,
而 "problem" 是句子中第 2 个也是第 6 个单词,但是应该返回最小下标 2。
输入:sentence = "i am tired", searchWord = "you"
输出:-1
解释:"you" 不是句子中任何单词的前缀。
输入:sentence = "i use triple pillow", searchWord = "pill"
输出:4
输入:sentence = "hello from the other side", searchWord = "they"
输出:-1
限制
1 <= sentence.length <= 100
1 <= searchWord.length <= 10
sentence
由小写英文字母和空格组成。searchWord
由小写英文字母组成。- 前缀就是紧密附着于词根的语素,中间不能插入其它成分,并且它的位置是固定的——-位于词根之前。(引用自 前缀_百度百科 )
算法
(枚举) $O(nm)$
- 将原字符串按照空格拆分,依次枚举判断。
时间复杂度
- 最坏情况下,每个位置都需要匹配,故时间复杂度为 $O(nm)$。
空间复杂度
- 需要 $O(n)$ 的额外空间传子串作为参数,但可以将函数内联来消除这一部分空间占用。
C++ 代码
class Solution {
public:
bool check(const string &x, const string &y) {
if (y.size() > x.size())
return false;
for (int i = 0; i < y.size(); i++)
if (x[i] != y[i])
return false;
return true;
}
int isPrefixOfWord(string sentence, string searchWord) {
sentence += " ";
size_t last, space;
last = 0;
int idx = 0;
while ((space = sentence.find(" ", last)) != string::npos) {
idx++;
if (check(sentence.substr(last, space - last), searchWord))
return idx;
last = space + 1;
}
return -1;
}
};