字符串习题
题目A- 雷同检测
考试的时候老师最讨厌有人抄袭了。自从有了电子评卷,老师要查找雷同卷,就容易多了,只要将两个人的答案输入计算机,进行逐个字符的比对,把相同的位置都找出来,就一目了然了。
输入格式
2 行,每行包含一串字符(长度不超过 200200)。
输出格式
1 行,包含若干个以空格分隔的数字,表示出现相同字符的位置。
Sample Input
I am suantoujun.
I am huayemei.
Sample Output
1 2 3 4 5 6 8 9
代码:
#include<iostream>
using namespace std;
int main()
{
string s1,s2;
getline(cin,s1);
getline(cin,s2);
int i=0,j=0;
while(s1[i]!='\0'&&s2[j]!='\0')
{
if(s1[i]==s2[j])
{
cout<<i+1<<" ";
}
i++;
j++;
}
return 0;
}
题目B- 首字母大写
对一个字符串中的所有单词,如果单词的首字母不是大写字母,则把单词的首字母变成大写字母。在字符串中,单词之间通过空白符分隔,空白符包括:空格(’ ‘)、制表符(’\t’)、回车符(’\r’)、换行符(’\n’)。
Input
输入一行:待处理的字符串(长度小于80)。
Output
输出一行:转换后的字符串。
Sample Input
if so, you already have a google account. you can sign in on the right.
Sample Output
If So, You Already Have A Google Account. You Can Sign In On The Right.
代码:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
string s;
getline(cin, s);
if (s[0] >= 'a' && s[0] <= 'z')
{
s[0] = s[0] - ('a' - 'A');
}
int i = 1;
while (s[i] != '\0')
{
if (s[i - 1] == ' ' || s[i - 1] == '\r' || s[i - 1] == '\t' || s[i] == '\n')
{
if (s[i] >= 'a' && s[i] <= 'z')
{
s[i] = s[i] - ('a' - 'A');
}
}
i++;
}
cout << s;
return 0;
}
问题C- 大小写转换
读入一些字符串,将其中的小写字母转成大写字母(其他字符不变)。
输入
输入为多行,每行为一个字符串,字符串只由字母和数字组成,长度不超过80。输入以“End of file”结束。
输出
对于每行输入,输出转换后的字符串。
输入示例
Hello
ICPC2004
12345abcde
输出示例
HELLO
ICPC2004
12345ABCDE
提示
用“scanf("%s", str) == 1”这个条件可以判断输入是否结束。如果此条件为假,则输入结束(对于本题)。
代码:
#include<stdio.h>
int main()
{
char str[85];
while (scanf("%s", str) !=EOF)
{
int i = 0;
while (str[i] != '\0')
{
if (str[i] >= 'a' && str[i] <= 'z')
{
str[i] = str[i] - ('a' - 'A');
}
i++;
}
printf("%s\n", str);
}
return 0;
}
问题D- 数字反转
给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 22)。
输入格式
输入共 11 行,一个整数 NN。
输出格式
输出共 1 行,一个整数,表示反转后的新数。
数据范围
-1,000,000,000 \le N \le 1,000,000,000−1,000,000,000≤N≤1,000,000,000。
Sample Input
123
Sample Output
321
代码:
#include<stdio.h>
#include<iostream>
using namespace std;
string fun(int n)
{
string str;
while (n)
{
int x = n % 10;
str += x + '0';
n /= 10;
}
int m = 0;
for (int i = 0; str[i] != '\0'; i++)
{
if (str[i] != '0')
{
m = i;
break;
}
}
return str.substr(m,str.size());
}
int main()
{
int n;
cin >> n;
if (n == 0)
{
cout << n << endl;
return 0;
}
bool flag=false;
if (n < 0)
{
n = abs(n);
flag = true;
}
string str;
str = fun(n);
if (flag)
{
cout << "-"<<str<<endl;
}
else
{
cout << str << endl;
}
return 0;
}
问题E- 删除单词后缀
给定一个单词,如果该单词以er、ly或者ing后缀结尾, 则删除该后缀(题目保证删除后缀后的单词长度不为 00),否则不进行任何操作。
输入格式
输入一行,包含一个单词(单词中间没有空格,每个单词最大长度为 3232)。
输出格式
输出按照题目要求处理后的单词。
Sample Input
referer
Sample Output
refer
代码:
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
string str;
cin >> str;
if (str.size() < 3)
{
cout << str << endl;
return 0;
}
string str1 = str.substr(str.size() - 2, str.size());
string str2 = str.substr(str.size() - 3, str.size());
if (str1 == "er" || str1 == "ly")
{
str = str.substr(0, str.size() - 2);
}
else if (str2 == "ing")
{
str = str.substr(0, str.size() - 3);
}
cout << str << endl;
return 0;
}
问题F- 判断字符串是否为回文
输入一个字符串,输出该字符串是否回文。回文是指顺读和倒读都一样的字符串。
输入格式
输入为一行字符串(字符串中没有空白字符,字符串长度不超过 100100)。
输出格式
如果字符串是回文,输出"yes";否则,输出"no"。
Sample Input
abcdedcba
Sample Output
yes
代码:
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
string str;
cin >> str;
bool flag = true;
int i = 0, j = str.size() - 1;
while (i <= j)
{
if (str[i] != str[j])
{
flag = false;
break;
}
i++;
j--;
}
if (flag)
{
cout << "yes" << endl;
}
else
{
cout << "no" << endl;
}
return 0;
}
问题G - 基础数据结构——栈(1)
给你一串字符,不超过50个字符,可能包括括号、数字、字母、标点符号、空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配。
Input
输入数据有多组,每组数据不超过100个字符并含有( ,) ,[, ],{, }一个或多个。处理到文件结束。
Output
如果匹配就输出“yes”,不匹配输出“no”
Sample Input
sin(20+10)
{[}]
Sample Output
yes
no
代码:
#include<stdio.h>
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
bool judge(char c)
{
if(c=='('||c=='['||c=='{')
return true;
if(c==')'||c==']'||c=='}')
return true;
return false;
}
void fun(string str)
{
stack<int>p;
for(int i=0;i<str.size();i++)
{
if(judge(str[i]))
{
if(p.empty())
{
p.push(str[i]);
}
else
{
char c=p.top();
p.pop();
if(str[i]==')')
{
if(c!='(')
{
p.push(c);
p.push(str[i]);
}
}
else if(str[i]==']')
{
if(c!='[')
{
p.push(c);
p.push(str[i]);
}
}
else if(str[i]=='}')
{
if(c!='{')
{
p.push(c);
p.push(str[i]);
}
}
else
{
p.push(c);
p.push(str[i]);
}
}
}
}
if(p.empty())
{
cout<<"yes"<<endl;
}
else
{
cout<<"no"<<endl;
}
}
int main()
{
char str[105];
while(cin.getline(str,1000,'\n'))
{
fun(str);
}
return 0;
}
问题H- 字典序
给你两个不同的字符串,如果第一个字符串的字典序小于第二个字符串,则输出YES,如果第一个字符串的字典序大于第二个字符串,则输出NO。
Input
两行。第一行一个字符串,第二行一个字符串。保证字符串的长度不超过10000。保证两个字符串不完全相等。
Output
如果第一个字符串的字典序小于第二个字符串,则输出YES,如果第一个字符串的字典序大于第二个字符串,则输出NO。
Sample Input
abc
abe
Sample Output
YES
代码:
#include<stdio.h>
#include<iostream>
#include<stack>
using namespace std;
int main()
{
string str1,str2;
cin >> str1 >> str2;
int i = 0, j = 0;
bool flag = false;
while (str1[i] != '\0' && str2[j] != '\0')
{
if (str1[i] == str2[j])
{
i++; j++;
}
else if (str1[i] < str2[j])
{
cout << "YES" << endl;
flag = true;
break;
}
else
{
cout << "NO" << endl;
flag = true;
break;
}
}
if (!flag)
{
if (str1[i] == '\0')
{
cout << "YES" << endl;
}
else
cout << "NO" << endl;
}
return 0;
}
问题I- 验证子串
输入两个字符串,验证其中一个串是否为另一个串的子串。
输入格式
输入两个字符串, 每个字符串占一行,长度不超过 200200 且不含空格。
输出格式
若第一个串 s1 是第二个串 s2的子串,则输出"(s1) is substring of (s2)";
否则,若第二个串 s2是第一个串s1的子串,输出"(s2) is substring of (s1)";
否则,输出"No substring"。
Sample Input
abc
dddncabca
Sample Output
abc is substring of dddncabca
代码:
#include<stdio.h>
#include<iostream>
#include<stack>
using namespace std;
int main()
{
string s1,s2;
cin >> s1 >> s2;
if (s1.size() == s2.size())
{
if (s1 == s2)
{
cout << s1 << " is substring of " << s2 << endl;
}
else
{
cout << "No substring" << endl;
}
}
else if (s1.size() < s2.size())
{
int n = s1.size();
bool flag = false;
for (int i = 0; i <= s2.size() - 1; i++)
{
if (i + n < s2.size()+1)
{
if (s2.substr(i, n) == s1)
{
cout << s1 << " is substring of " << s2 << endl;
flag = true;
break;
}
}
}
if (!flag)
{
cout << "No substring" << endl;
}
}
else
{
int n = s2.size();
bool flag = false;
for (int i = 0; i <= s1.size() - 1; i++)
{
if (i + n <= s1.size())
{
if (s1.substr(i, n) == s2)
{
cout << s2 << " is substring of " << s1 << endl;
flag = true;
break;
}
}
}
if (!flag)
{
cout << "No substring" << endl;
}
}
return 0;
}
问题J - 子串查找
题目描述
这是一道模板题。
给定一个字符串 AA 和一个字符串 BB,求 BB 在 AA 中的出现次数。AA 和 BB 中的字符均为英语大写字母或小写字母。
AA 中不同位置出现的 BB 可重叠。
输入格式
输入共两行,分别是字符串 AA 和字符串 BB。
输出格式
输出一个整数,表示 BB 在 AA 中的出现次数。
样例
Input
zyzyzyz
zyz
Output
3
数据范围与提示
1≤A,B 的长度 10 ^ 6,A,B 仅包含大小写字母。
代码:
#include<stdio.h>
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
typedef long long ll;
const ll N = 1e6 + 10;
long long net[N];
void getnext(string str)
{
net[0] = -1;
ll i = 0, k = -1;
ll n = str.size();
while (i < n)
{
if (k == -1 || str[i] == str[k])
{
k++;
i++;
net[i] = k;
}
else
{
k = net[k];
}
}
}
void kmp(string s1, string s2)
{
getnext(s2);
ll m = s1.size();
ll n = s2.size();
ll i = 0, j = 0;
ll cnt = 0;
while (i < m)
{
if (j==-1||s1[i] == s2[j])
{
i++; j++;
}
else
{
j = net[j];
}
if (j == n)
{
cnt++;
}
}
cout << cnt << endl;
}
int main()
{
string s1, s2;
cin >> s1 >> s2;
kmp(s1, s2);
return 0;
}
问题K - 剪花布条
题目描述
原题来自:HDU 2087
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
输入格式
输入数据为多组数据,读取到 # 字符时结束。每组数据仅有一行,为由空格分开的花布条和小饰条。花布条和小饰条都是用可见 ASCII 字符表示的,不会超过 10001000 个字符。
注意:这个 # 应为单个字符。若某字符串开头有 #,不意味着读入结束!
输出格式
对于每组数据,输出一行一个整数,表示能从花纹布中剪出的最多小饰条个数。
样例
Input
abcde a3
aaaaaa aa
Output
0
3
数据范围与提示
对于全部数据,字符串长度≤1000。
代码:
#include<stdio.h>
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
int fun(string s1,string s2)
{
int cnt = 0;
while (1)
{
int pos = s1.find(s2);
if (pos >= 0)
{
s1 = s1.substr(pos + s2.size());
cnt++;
}
else
break;
}
return cnt;
}
int main()
{
string s1, s2;
while (1)
{
cin >> s1;
if (s1 == "#")
break;
cin >> s2;
cout << fun(s1, s2) << endl;
}
return 0;
}
问题L - 最长回文子串
输入一个字符串Str,输出Str里最长回文子串的长度。
回文串:指aba、abba、cccbccc、aaaa这种左右对称的字符串。
串的子串:一个串的子串指此(字符)串中连续的一部分字符构成的子(字符)串
例如 abc 这个串的子串:空串、a、b、c、ab、bc、abc
Input
输入Str(Str的长度 <= 1000)
Output
输出最长回文子串的长度L。
Sample Input
daabaac
Sample Output
5
代码:
#include<stdio.h>
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
int fun(string str)
{
int n = str.size();
if (n == 1)
{
return 1;
}
vector<vector<int>>dp(n, vector<int>(n));
int maxlen = 0;
for (int i = 0; i < n; i++)
{
dp[i][i] = 1;
}
for (int L = 2; L <= n; L++)
{
for (int i = 0; i < n; i++)
{
int j = L + i - 1;
if (j >= n)
break;
if (str[i] != str[j])
dp[i][j] = 0;
else
{
if (j - i < 3)
dp[i][j] = 1;
else
dp[i][j] = dp[i + 1][j - 1];
}
if (dp[i][j] && j - i + 1 > maxlen)
{
maxlen = j - i + 1;
}
}
}
return maxlen;
}
int main()
{
string str;
cin >> str;
cout << fun(str) << endl;
return 0;
}