题目链接
题目描述
一个字符串是“快乐的”,当且仅当它包含以下四个连续子串中的任意一个:cheerful
, glad
, happy
, pleased
。
给定一个字符串,判断它是否是“快乐的”。
解题思路
这是一个基础的字符串处理问题,核心是进行子串的搜索。由于需要查找的“快乐的”子串是固定的、数量很少的四个单词,我们可以采用最直接的方法来解决。
算法流程
-
定义快乐单词列表:首先,我们有一个固定的目标列表:
{"cheerful", "glad", "happy", "pleased"}
。 -
遍历检查:对于输入的每一个字符串
s
,我们只需要检查它是否包含了上述列表中的至少一个单词。 -
利用内建函数:我们可以遍历这个列表中的每一个单词,然后使用编程语言内建的字符串查找函数来判断该单词是否存在于
s
中。- 只要我们找到了第一个匹配的快乐单词,就可以立即确定该字符串是“快乐的”,输出 "Yes",并停止对当前字符串的后续检查。
- 如果我们检查完了所有四个快乐单词,都没有在
s
中找到任何一个,那么这个字符串就不是“快乐的”,我们输出 "No"。
这个方法简单直接,并且对于题目给定的数据规模来说效率足够高。
代码
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void solve() {
string s;
cin >> s;
if (s.find("cheerful") != string::npos ||
s.find("glad") != string::npos ||
s.find("happy") != string::npos ||
s.find("pleased") != string::npos) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while (t-- > 0) {
String s = sc.next();
if (s.contains("cheerful") || s.contains("glad") ||
s.contains("happy") || s.contains("pleased")) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
}
import sys
def solve():
s = sys.stdin.readline().strip()
if "cheerful" in s or "glad" in s or "happy" in s or "pleased" in s:
print("Yes")
else:
print("No")
def main():
try:
t_str = sys.stdin.readline()
if not t_str: return
t = int(t_str)
for _ in range(t):
solve()
except (IOError, ValueError):
return
if __name__ == "__main__":
main()
算法及复杂度
-
算法:字符串搜索
-
时间复杂度:
。
是测试数据的组数。
- 对于每一组数据,设输入字符串长度为
。我们需要检查 4 个固定的子串。使用内建的查找函数,其时间复杂度通常与
呈线性关系。因此,处理一个字符串的总时间为
。
-
空间复杂度:
。
- 需要
的空间来存储输入的字符串。
- 需要