题目描述
句子 是一个单词列表,列表中的单词之间用单个空格隔开,且不存在前导或尾随空格。每个单词仅由大小写英文字母组成(不含标点符号)。
- 例如,
"Hello World"
、"HELLO"
和"hello world hello world"
都是句子。
给你一个句子 s
和一个整数 k
,请你将 s
截断,使截断后的句子仅含 前 k
个单词。返回 截断 s
后得到的句子。
样例
输入:s = "Hello how are you Contestant", k = 4
输出:"Hello how are you"
解释:
s 中的单词为 ["Hello", "how" "are", "you", "Contestant"]。
前 4 个单词为 ["Hello", "how", "are", "you"]。
因此,应当返回 "Hello how are you"。
输入:s = "What is the solution to this problem", k = 4
输出:"What is the solution"
解释:
s 中的单词为 ["What", "is" "the", "solution", "to", "this", "problem"]。
前 4 个单词为 ["What", "is", "the", "solution"]。
因此,应当返回 "What is the solution"。
输入:s = "chopper is not a tanuki", k = 5
输出:"chopper is not a tanuki"
限制
1 <= s.length <= 500
k
的取值范围是 [1,s
中单词的数目]。s
仅由大小写英文字母和空格组成。s
中的单词之间由单个空格隔开。- 不存在前导或尾随空格。
算法
(模拟) $O(n)$
- 按照题目描述模拟。
- 每遇到一个空格,就将 $k$ 减一。如果 $k$ 被减为了 0,则直接返回字符串的当前前缀。
时间复杂度
- 最多遍历一次字符串,故时间复杂度为 $O(n)$。
空间复杂度
- 需要 $O(n)$ 的额外空间存储答案。
C++ 代码
class Solution {
public:
string truncateSentence(string s, int k) {
const int n = s.size();
for (int i = 0; i < n; i++) {
if (s[i] != ' ') continue;
k--;
if (k == 0)
return s.substr(0, i);
}
return s;
}
};