题目描述
输入两个字符串,验证其中一个串是否为另一个串的子串。
题目链接:B2118 验证子串 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
输入格式
两行,每行一个字符串。
输出格式
若第一个串 是第二个串 的子串,则输出(s1) is substring of (s2)
;
否则,若第二个串 是第一个串 的子串,输出(s2) is substring of (s1)
;
否则,输出 No substring
。
解题思路
由于输入的两个字串具有随机性,首先应该比较哪个字符串的长度更短,作为被验证的对象。
最外层通过for循环遍历较长的字符串,当遇到该字符和短字符串的第一个字符相等时,从该处进行内层for循环遍历,看后面的字符是否也相等,如果中途判断到不相等则退出内层for循环,继续进行外层循环。
解题代码
C代码
#include<stdio.h>
#include<string.h>
int main(){
char s1[21];
char s2[21];
scanf("%s\n%s",&s1,&s2);
int len1 = strlen(s1);
int len2 = strlen(s2);
int flag = 0;//定义判断标志flag
//有三种可能s1是s2的字串,或者相反,或者都不是
for(int i = 0; i < len2; i++){
flag = 1;
for(int j = i; j < len1+i; j++){
if(s1[j-i] != s2[j])//一个一个遍历
flag = 0;
}
if(flag == 1){
printf("%s is substring of %s",s1,s2);
return 0;
}
}
for(int i = 0; i < len1; i++){
flag = 1;
for(int j = i; j < len2+i; j++){
if(s2[j-i] != s1[j])
flag = 0;
}
if(flag == 1){
printf("%s is substring of %s",s2,s1);
return 0;
}
}
if(flag != 1)
printf("No substring");
return 0;
}
C++代码
#include<iostream>
using namespace std;
int main()
{
string str1,str2;
cin>>str1>>str2;
int len1 = str1.size(),len2 = str2.size(); //存储长度
bool flag = false;
for(int i=0;i+len1<=len2;i++){
if(str2.substr(i,len1) == str1){ //substr截取字符串从i开始长度为len1
flag = true;
break;
}
}
//判断第一个字符串是否是第二个字符串的子串
if(flag) cout<<str1<<" is substring of "<<str2;
else{
for(int i=0;i+len2<=len1;i++){
if(str1.substr(i,len2) == str2){
flag = true;
break;
}
}
//判断第二个字符串是否是第一个字符串的子串
if(flag) cout<<str2<<" is substring of "<<str1;
else cout<<"No substring";
}
return 0;
}
Java代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//输入数据
Scanner scanner = new Scanner(System.in);
String str1 = scanner.next();
String str2 = scanner.next();
//确保str1字符串是较长的那一个
if(str1.length() < str2.length()){
String temp = str2;
str2 = str1;
str1 = temp;
}
boolean temp = false;//用来记录控制台是否输出了东西
for (int i = 0; i < str1.length(); i++){
//如果该字符和被比较的第一个字符一样,查找后面的字符是否一样
if(str1.charAt(i) == str2.charAt(0)){
boolean flag = true;
for (int j = 1; j < str2.length(); j++){
if((i + j) < str1.length() && str1.charAt(i + j) != str2.charAt(j)){
//如果中途不相等
//flag置为假
flag = false;
break;
}
}
if(flag){//说明找到了
System.out.println(str2 + " is substring of " + str1);
temp = true;
break;
}
}
}
if(!temp){
System.out.println("No substring");
}
}
}
拓展
当然C里面提供这种查找的函数:
#include<stdio.h>
#include<string.h> //strstr的头文件
int main()
{
char str1[] = "abcdefgh"; //定义字符串
char str2[] = "def";
char* t = strstr(str1,str2); //在字符串str1中查找字符串str2的位置
//找到则返回str2首元素在str1中第一次出现的位置,否则返回NULL
printf("%d",t-str1); //返回的是地址值,减去字符串的首地址就是str2在str1中首次出现的下表值
return 0;
}