字符串类型题目反思(1)

P5734 【深基6.例6】文字处理软件

题目描述

你需要开发一款文字处理软件。最开始时输入一个字符串作为初始文档。可以认为文档开头是第 0 个字符。需要支持以下操作:

  • 1 str:后接插入,在文档后面插入字符串 str,并输出文档的字符串;
  • 2 a b:截取文档部分,只保留文档中从第 a 个字符起 b 个字符,并输出文档的字符串;
  • 3 a str:插入片段,在文档中第 a 个字符前面插入字符串 str,并输出文档的字符串;
  • 4 str:查找子串,查找字符串 str 在文档中最先的位置并输出;如果找不到输出 −1。

为了简化问题,规定初始的文档和每次操作中的 str 都不含有空格或换行。最多会有 q 次操作。

输入格式

第一行输入一个正整数 q,表示操作次数。

第二行输入一个字符串 str,表示最开始的字符串。

第三行开始,往下 q 行,每行表示一个操作,操作如题目描述所示。

输出格式

一共输出 q 行。

对于每个操作 1,2,3,根据操作的要求输出一个字符串。

对于操作 4,根据操作的要求输出一个整数。


分析:

这道题是考察string下追加(+=)、截取(substr)、插入(insert)、查找(find) 四种基础操作。


学到的新函数:

1) substr:

string.substr(起始索引,长度)

2)insert:

string.insert(索引,字符串)

3)find:

通常格式如下:

cin>>str;	                // 输入要查找的子串
    size_t pos=s1.find(str);    // 查找str在s1中的起始索引,返回值类型为size_t(无符号整数)
    if(pos==string::npos)       // string::npos是特殊值,表示“没找到”
        cout<<-1<<endl;         // 没找到输出-1
    else 
        cout<<pos<<endl;        // 找到输出起始索引

下面是这道题的AC代码:

#include<iostream> 
#include<string>
using namespace std;
int main(){
	int q;int x;string s1 , str;
	cin>>q;
	cin>>s1;
	while(q--){
		cin>>x;
		if(x==1){		
			cin>>str;
			s1+=str;
			cout<<s1<<endl;;
		}
		if(x==2){
			int a,b;
			cin>>a>>b;
			s1=s1.substr(a,b);
			cout<<s1<<endl;
		}
		if(x==3){
			int n;
			cin>>n>>str;
			s1.insert(n,str);
			cout<<s1<<endl;
		}
		if(x==4){	
			cin>>str;	
			size_t pos=s1.find(str);
			if(pos==string::npos)
				cout<<-1<<endl;
			else 
				cout<<pos<<endl;
		}
 	} 
	return 0;
}

P1308 [NOIP 2011 普及组] 统计单词数

题目描述

一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。

现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例 1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 2)。

输入格式

共 2 行。

第 1 行为一个字符串,其中只含字母,表示给定单词;

第 2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。

输出格式

一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 0 开始);如果单词在文章中没有出现,则直接输出一个整数 −1。

注意:空格占一个字母位


分析:如果只是单纯地运用find函数,则会造成只能输出第一次出现的下标、将单词一部分也算作在内等情况。所以可以用for循环遍历string字符串,遇到“空格”就停一下,看看这个单词是不是想要的。


学到的新函数:

clear:

string.clear()将string里的所有东西都清空。


下面是AC代码:

#include <iostream>
#include <string>
using namespace std ;
//编一个函数,用于将大写字母转成小写字母 
string to_lower(string s) {
    for (int i = 0; i < s.size(); i++) {
        s[i] = tolower(s[i]);  // 逐个字符转小写
    }
    return s;
}
int main(){
	string s1 , s2 ;
	getline(cin , s1) ;
	getline(cin , s2) ;

//将字符串全部转成小写字母的 
	s1 = to_lower(s1) ;
	s2 = to_lower(s2) ;
	
	int cnt = 0 , first = -1 ;
	string word ;
	for(int i = 0 ; i <= s2.size() ; i ++){
		if(i == s2.size() || s2[i] == ' '){
			if(word == s1){
				cnt ++ ;
				if(first == - 1)
					first = i-s1.size() ;
			}
			word.clear() ;
		}
		else{
			word += s2[i] ;
		}	
	}
	if(cnt > 0)
		cout << cnt << ' ' << first ;
	else
		cout << -1 ;
	return 0 ;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值