C++ 字符串问题&题目练习

字符串问题平时的使用中也是蛮多的。所以在这里开个坑,慢慢的学习字符串的常见用法并把它们实际应用。

文章目录

  • 1:字符串的常见操作与常用方法
    • (1)字符串的截取、连接、替换
    • (3)字符串的记录、转换
  • 2:实践练习
    • 1:剑指offer 58 左旋转字符串
    • 2:IP地址无效化
    • 3:旅行终点站
    • 4:转换成小写字母

1:字符串的常见操作与常用方法

(1)字符串的截取、连接、替换

①字符串的截取:
定义时截取 或者 substr()函数截取
应用–> 2.1左旋转字符串

#include 
#字符串的截取
string phrase = "abcde12345";
string phr1(phrase,0,5);  //从0开始,截取5个字符 abcde

string phr2 ;
phr2 = phrase.substr(0,5); //从0开始,截取5个字符 abcde

string phr3 ;
phr3 = phrase.substr(5);  //从5开始,截取后面部分

②字符串的替换:
替换: 先查找再替换。一般查找方法有find()的迭代器查找或自己写的迭代查找。而替换则使用 replace(i,n,str);
应用–> 2.2 IP地址无效化

#字符串的替代
string phrase = "1.1.1.1";
phrase.replace(1,1,"[.]");  //位置1,一个字符,替代为[.] 1[.]1.1.1

(3)字符串的记录、转换

①字符串的记录:
问题涉及到字符串中对象的连接问题时,可以利用Hash表记录类型的出入度。
应用: 2.3旅行终点站(图的出度问题)

unordered_map<string,int> hlpher;  //记录节点与数据
hlpher[str] = 0;   //对应着字符串str的0值

②字符串的转换:
问题常常涉及到字符串中字符的大小写转换。
一般的 大写字母A-Z (65~90) 小写字母a-z (97-122)
大写字母=小写字母-32 小写字母=大写字母+32
应用–> 2.4转换成小写字母

(4)字符串–常用方法
①字符串的颠倒:(s+s).substr(n,s.size())

①字符串变换类: 原位替换、对照替换、先截取后连接、先连接后截取

2:实践练习

1:剑指offer 58 左旋转字符串

题目:给定一个字符串,将字符串前面n个字符转移到字符串后面
(1)解题方法:
①将前面n个字符与后面字符分别截取,然后连接。
**②将2个相同的字符串连接,这样前面的n个字符串就会出现在后面,然后截取新字符串的对应长度部分。–>常见的颠倒问题解法

//先连接后截取法:颠倒解法
string reverseLeftWords(string s, int n) 
{
  return (s+s).substr(n,s.size());
};
//先截取后连接法
string reverseLeftWords(string s, int n) 
{
  string s1(s,0,n);
  string s2(s,n);
  return s2+s1;
};

2:IP地址无效化

题目:给定字符串1.1.1.1 … 将其中的.全部替换为[.]
(1)解题方法:
①迭代查找.,然后replace

string defangIPaddr(string address)
{
  for(int i=0;i<address.size();i++)
  {
    if(address[i]=='.') 
    {
      address.replace(i,1,"[.]");
      i+=2;
    }
  }
  return address;
};

3:旅行终点站

题目:给定旅游路线用数组表示,path[0]=[“cityA”,“cityB”]。没有任何通路通往其他的城市的,是终点站。
(1)解题思路: 将问题转化,可以理解为求解图中出度为的节点。一般的可以用Hash表来记录节点与入度出度。
(2)算法实现

string destCity(vector<vector<string>>& paths)
{
  unordered_map<string,int> Map;
  for(auto path:paths)
  {
    Map[path[0]] +=1;
    Map[path[1]] +=0;
  }
  for(auto p:Map)
  {
    if(p.second ==0)
    return p.first;
  }
  return "";
}

4:转换成小写字母

题目:给定一个字符串,将字符串中的大写字母转化为小写字母并返回字符串。
(1)解题思路: 迭代查找替换法,replace()函数需要准确的替换内容且为字符串,故不适合本题型。此时可以迭代查找人工替换

string toLowerCase(string str)
{
  for(int i=0;i<str.size();i++)
  {
    if((str[i]>=65)&&(str[i]<=90))
    str[i] = str[i]+32;
  }
  return str;
}

你可能感兴趣的:(数据结构与算法)