字符串题解

题目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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值