简单字符串处理

预告:我用两年写的新书《算法竞赛》,已于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++)   //把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;
}

2. Python字符串处理

  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

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) );      //输出: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() 查找字符或者子串后一次出现的地方。

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/

猜你喜欢

转载自blog.csdn.net/weixin_43914593/article/details/123816703