预告:我用两年写的新书《算法竞赛》,已于2022年2月交给清华大学出版社,预计于2022年7月出版。《算法竞赛》是一本“大全”,内容覆盖“基础-中级-高级”,篇幅700页左右。部分知识点的草稿已经在本博客发表。
find()函数:查找
substr()函数:查子串
replace()函数:替换
insert()函数:插入
append()函数:添加字符串
swap()函数:交换字符串
compare():字符串比较
有时候输入的一行字符中有空格,可以用gets()读取包括空格的这一行。
下面的可执行代码,演示了这些函数的应用。
#include
using namespace std;
int main(){
string str ="123456789abcdefghiaklmn";
for(int i=0;i<10;i++) //把str看成一个字符串数组
cout<<str[i]<<" ";
cout << endl;
//find函数
cout<<"123的位置: "<<str.find("123")<<endl;
//输出:123的位置: 0
cout<<"34在str[2]到str[n-1]中的位置: "<<str.find("34",2)<<endl;
//输出:34在str[2]到str[n-1]中的位置: 2
cout<<"ab在str[0]到str[12]中的位置: "<<str.rfind("ab",12)<<endl;
//输出:ab在str[0]到str[12]中的位置: 9
//substr()函数
cout<<"str[3]及以后的子串:"<<str.substr(3)<<endl;
//输出:str[3]及以后的子串:456789abcdefghijklmn
//若小于限制长度则报错
cout<<"从str[2]开始的4个字符:"<<str.substr(2,4)<<endl;
//输出:从str[2]开始的4个字符:3456
//find()函数
str.replace(str.find("a"), 5, "@#");
cout<<str<<endl;
//输出:123456789@#fghiaklmn
//insert()函数
str.insert(2, "***");
cout<<"从2号位置插入: "<<str<<endl;
//输出:12***3456789@#fghiaklmn
//添加字符串:append()函数
str.append("$$$");
cout<<"在字符串str后面添加字符串:"<<str<<endl;
//输出: 12***3456789@#fghiaklmn$$$
//字符串长度
cout<<str.size()<<endl;
cout<<str.length()<<endl;
//交换字符串:swap()函数
string str1="aaa",str2="bbb";
swap(str1, str2);
cout<<str1<<" "<<str2<<endl;
//字符串比较函数:compare(),相等输出0,不等输出1
cout<<str1.compare(str2)<<endl;
if(str1==str2) cout <<"=="; //直接比较也行
if(str1!=str2) cout <<"!=";
return 0;
}
Python的字符处理十分简洁。下面的可执行代码,给出各种应用的例子。
str1="12345678abcdefghi"
print(str1) #输出:12345678abcdefghi
print(str1[3]) #输出:4
print(str1[2:5]) #输出:345 截取一部分,左闭右开
print(str1[:5]) #输出:12345
print(str1[2:]) #输出:345678abcdefghi
print(len(str1)) #输出字符串长度: 17
str2="***"
str3="abc"
#合并字符串:+
str12=str1+str2
print(str12) #输出:12345678abcdefghi***
#也可以这样合并字符串
print(''.join([str1, str2])) #输出:12345678abcdefghi***
str_list = list(str1)
str_list.insert(4, "***") #在str1[4]插入
aa = ''.join(str_list)
print(aa) #输出:1234***5678abcdefghi
#重复输出
print(str2*2) #输出:******
#用\输出特殊符号
print("\\ \" \n ") #输出:\ " 换行
#查找子串
print(str3 in str1) #输出:True
print(str3 not in str1) #输出:False
str2,str3 = str3,str2 #交换
print(str2) #输出:abc
#比较
print(str2 == str3) #输出:False
print(str2 != str3) #输出:True
#str.find(str, beg=0, end=len(string)) 指定范围查找
print(str1.find("345")) #输出:2
print(str1.find("345", 10)) #输出:-1
print(str1.find("456", 2,20)) #输出:3
Java的字符串处理函数很丰富。下面给出部分函数的说明。
(1)substring()
返回指定位置的子串。有两种形式:
String substring(int startIndex),起始索引(包括startIndex), 索引从 0 开始。
String substring(int startIndex,int endIndex)
起始索引(包括startIndex), 索引从 0 开始;结束索引(不包括endIndex)。
String Str = new String("This is haha");
System.out.println(Str.substring(4) ); //输出:is haha
System.out.println(Str.substring(4, 10) ); //输出:is ha
(2)concat()
public String concat(String s)
在字符串后面连接s,返回新字符串。
String s = "www:";
s = s.concat("abcde.com");
System.out.println(s); //输出:www.abcde.com
(3)replace()
替换。
public String replace(char searchChar, char newChar)
用newChar字符替换字符串中出现的所有 searchChar 字符,并返回替换后的新字符串。
String Str = new String("abcde");
System.out.println(Str.replace('c', 'T')); //输出:abTde
(4)trim()
删除字符串的头尾空格。
(5)valueOf()
返回给定参数的数值,参数可以是原生数据类型, String等。
static Integer valueOf(int i)
static Integer valueOf(String s)
static Integer valueOf(String s, int radix)
Float a = Float.valueOf("80");
System.out.println(a); //输出:80.0
(6)toLowerCase()
转换为小写
char toLowerCase(char ch)
System.out.println(Character.toLowerCase('a')); //输出:a
System.out.println(Character.toLowerCase('A')); //输出:a
(7)toUpperCase()
转换为大写
public String toUpperCase()
String Str = new String("www.com");
System.out.println( Str.toUpperCase() ); //输出:WWW.COM
(8)length()
字符串的长度
String Str1 = new String("www.com");
System.out.println(Str1.length()); //输出:7
(9)charAt()
截取一个字符
public char charAt(int index)
String s = "www.com";
char result = s.charAt(6);
System.out.println(result); //输出:m
(10)getChars() 截取多个字符
将字符从字符串复制到目标字符数组。
void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)
sourceStart – 字符串中要复制的第一个字符的索引。
sourceEnd – 字符串中要复制的最后一个字符之后的索引。
target 目标数组。
targetStart 目标数组中的起始偏移量。
String Str1 = new String("www.abcde.com");
char[] Str2 = new char[6];
Str1.getChars(4, 10, Str2, 0);
System.out.println(Str2 ); //输出:abcde
(11)equals()和equalsIgnoreCase()
比较两个字符串
(12)regionMatches()
检测两个字符串在一个区域内是否相等。
(13)startsWith()和endsWith()
startsWith()检测字符串是否以指定的字符串开始。endWith()检测字符串是否以指定的字符串结束。
(14)compareTo()和compareToIgnoreCase()
比较字符串
(15)indexOf()和lastIndexOf()
indexOf() 查找字符或者子串第一次出现的地方。
lastIndexOf() 查找字符或者子串后一次出现的地方。
下面做一些简单的字符串题目,都不涉及到算法或数据结构。这样的题目在蓝桥杯省赛中比较常见。
请自己做这些题,这是最重要的。如果要看正确代码,每道题都有人发布题解,C++、Java、Python的都有。本文不再贴出代码。
标题统计 https://www.lanqiao.cn/problems/325/learning/
罗马数字 https://www.lanqiao.cn/problems/276/learning/
删除字符 https://www.lanqiao.cn/problems/544/learning/
扫雷游戏 https://www.lanqiao.cn/problems/358/learning/
潜伏者 https://www.lanqiao.cn/problems/519/learning
ISBN 号码 https://www.lanqiao.cn/problems/523/learning/
字符串的展开 https://www.lanqiao.cn/problems/536/learning/
FBI树 https://www.lanqiao.cn/problems/571/learning/
单词接龙 https://www.lanqiao.cn/problems/769/learning/
立体图 https://www.lanqiao.cn/problems/526/learning/
计算器的改良 https://www.lanqiao.cn/problems/771/learning/
串的处理 https://www.lanqiao.cn/problems/287/learning/
谁拿了最多奖学金 https://www.lanqiao.cn/problems/565/learning/
子串 https://www.lanqiao.cn/problems/365/learning/
表达式求值 https://www.lanqiao.cn/problems/378/learning
单词分析 https://www.lanqiao.cn/problems/504/learning
统计单词数 https://www.lanqiao.cn/problems/397/learning/
乒乓球 https://www.lanqiao.cn/problems/744/learning/
回文数 https://www.lanqiao.cn/problems/774/learning/