预告:我用两年写的新书《算法竞赛》,已于2022年2月交给清华大学出版社,预计于2022年7月出版。《算法竞赛》是一本“大全”,内容覆盖“基础-中级-高级”,篇幅700页左右。部分知识点的草稿已经在本博客发表。
?? 简单字符串题目,也就是不涉及复杂字符串算法的简单题。
在蓝桥杯省赛中很常见,几乎每届都有。
??
字符串算法有:进制哈希、Manacher、字典树、回文树、KMP 、AC自动机、后缀树和后缀数组、后缀自动机,在将出版的《算法竞赛》中详细解析。
?? 本文介绍
C++、Java、Python的字符串处理函数。最后给出一些习题,
自己练习这些题,是最重要的。
1. C++的字符串函数
??find()函数:查找 ??substr()函数:查子串 ??replace()函数:替换 ??insert()函数:插入 ??append()函数:添加字符串 ??swap()函数:交换字符串 ??compare():字符串比较 ??有时候输入的一行字符中有空格,可以用gets()读取包括空格的这一行。 ??下面的可执行代码,演示了这些函数的应用。
#include<bits/stdc++.h>
using namespace std;
int main(){
string str ="123456789abcdefghiaklmn";
for(int i=0;i<10;i++)
cout<<str[i]<<" ";
cout << endl;
cout<<"123的位置: "<<str.find("123")<<endl;
cout<<"34在str[2]到str[n-1]中的位置: "<<str.find("34",2)<<endl;
cout<<"ab在str[0]到str[12]中的位置: "<<str.rfind("ab",12)<<endl;
cout<<"str[3]及以后的子串:"<<str.substr(3)<<endl;
cout<<"从str[2]开始的4个字符:"<<str.substr(2,4)<<endl;
str.replace(str.find("a"), 5, "@#");
cout<<str<<endl;
str.insert(2, "***");
cout<<"从2号位置插入: "<<str<<endl;
str.append("$$$");
cout<<"在字符串str后面添加字符串:"<<str<<endl;
cout<<str.size()<<endl;
cout<<str.length()<<endl;
string str1="aaa",str2="bbb";
swap(str1, str2);
cout<<str1<<" "<<str2<<endl;
cout<<str1.compare(str2)<<endl;
if(str1==str2) cout <<"==";
if(str1!=str2) cout <<"!=";
return 0;
}
2. Python字符串处理
??Python的字符处理十分简洁。下面的可执行代码,给出各种应用的例子。
str1="12345678abcdefghi"
print(str1)
print(str1[3])
print(str1[2:5])
print(str1[:5])
print(str1[2:])
print(len(str1))
str2="***"
str3="abc"
str12=str1+str2
print(str12)
print(''.join([str1, str2]))
str_list = list(str1)
str_list.insert(4, "***")
aa = ''.join(str_list)
print(aa)
print(str2*2)
print("\\ \" \n ")
print(str3 in str1)
print(str3 not in str1)
str2,str3 = str3,str2
print(str2)
print(str2 == str3)
print(str2 != str3)
print(str1.find("345"))
print(str1.find("345", 10))
print(str1.find("456", 2,20))
3. Java字符串函数
??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) );
System.out.println(Str.substring(4, 10) );
(2)concat() ??public String concat(String s) ??在字符串后面连接s,返回新字符串。
String s = "www:";
s = s.concat("abcde.com");
System.out.println(s);
??(3)replace() ??替换。 ??public String replace(char searchChar, char newChar) ??用newChar字符替换字符串中出现的所有 searchChar 字符,并返回替换后的新字符串。
String Str = new String("abcde");
System.out.println(Str.replace('c', 'T'));
??(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);
??(6)toLowerCase() ??转换为小写 ??char toLowerCase(char ch)
System.out.println(Character.toLowerCase('a'));
System.out.println(Character.toLowerCase('A'));
??(7)toUpperCase() ??转换为大写 ??public String toUpperCase()
String Str = new String("www.com");
System.out.println( Str.toUpperCase() );
??(8)length() ??字符串的长度
String Str1 = new String("www.com");
System.out.println(Str1.length());
??(9)charAt() ??截取一个字符 ??public char charAt(int index)
String s = "www.com";
char result = s.charAt(6);
System.out.println(result);
??(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 );
??(11)equals()和equalsIgnoreCase() ??比较两个字符串 ??(12)regionMatches() ??检测两个字符串在一个区域内是否相等。 ??(13)startsWith()和endsWith() ??startsWith()检测字符串是否以指定的字符串开始。endWith()检测字符串是否以指定的字符串结束。 ??(14)compareTo()和compareToIgnoreCase() ??比较字符串 ??(15)indexOf()和lastIndexOf() ??indexOf() 查找字符或者子串第一次出现的地方。 ??lastIndexOf() 查找字符或者子串后一次出现的地方。
4. 习题
??下面做一些简单的字符串题目,都不涉及到算法或数据结构。这样的题目在蓝桥杯省赛中比较常见。 ??请自己做这些题,这是最重要的。如果要看正确代码,每道题都有人发布题解,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/
|