机试常用算法和题型-字符串专题

字符串专题

1.统计单词频率

#include 
#include 
#include 
#include 
using namespace std;

int main()
{
    string str;

    while(getline(cin,str)){
        int hashTable[26]={0};
        int maxn=-1;
        for(int i=0;i
#include 
#include 
#include 
#include 
#include 
using namespace std;

int main()
{
    string str;
    int hashTable[26]={0};
    int anum=0,wnum=0,cntMax=0;
    while(cin>>str){
        anum=anum+str.size();
        wnum++;
        for(int i=0;i

2.密文加密

#include 
#include 
#include 
#include 
using namespace std;

int main()
{
    string str;

    while(getline(cin,str)){
        for(int i=0;i

cctype头文件中处理字符函数

[图片上传失败...(image-578378-1587804682906)]

3.find使用,删除指定子串,transform使用

对于字符串string,需要使用string头文件,包含以下常用方法:

s.find(str,[pos]):在字符串s中从第 pos 个字符开始寻找 str ,并返回位置,如果找不到返回-1。pos 可省略,默认为0

s.erase(pos,n):从给定起始位置 pos 处开始删除,要删除字符的长度为n,返回修改后的string对象
#include 
#include 
#include 
#include 
using namespace std;

int main()
{
    string str;

    while(cin>>str){
        int pos=0;
        string word="gzu";
        //果然字符串还是得要用双引号稳妥,pos放在下面也更稳妥
        while(str.find(word,pos)!=string::npos){
            pos=str.find(word,pos);

            str.erase(pos,3);
        }
        cout<>str){
        int pos=0;
        string word="gzu";
        string temp=str;
        transform(str.begin(),str.end(),str.begin(),::tolower);
      //while ((pos = str1.find("gzu")) != -1)也可!!
        while(str.find(word,pos)!=string::npos){
            pos=str.find(word,pos);
            str.erase(pos,3);
            temp.erase(pos,3);
        }
        cout<

4.字符串前缀识别

#include 
#include
using namespace std;
int main()
{
    char str[100][100];
    int n;
    while (cin >> n&& n)
    {
        for (int i = 0; i < n; i++)
        {
            cin >> str[i];
        }
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (i == j)continue;//比较不同字符串
                if (str[i][0] == '@')continue;//已经修改过的就不用再判断了
                bool flag = true;
                for (int k = 0; k < strlen(str[i])&& flag; k++)
                {
                    if (str[i][0] == '@')
                        flag = false;
                    if (str[i][k] != str[j][k])
                        flag = false;
                }
                if (flag)
                {
                    str[i][0] = '@';
                }
            }
        }
        int ans = 0;
        for (int i = 0; i < n; i++)
        {
            if (str[i][0] != '@')
                ans++;
        }
        cout << ans << endl;
    }
    return 0;
}

给定字符串找出重复字符和位置,*号法

/*对于给定字符串,找出有重复的字符,并给出其位置*/
#include 
#include 
#include 
using namespace std;
int main(){
    string str;
    while(cin>>str){
        int len=str.size();
        for(int i=0;i

5.string循环截取的两种办法

//记录当前位置截取法,有当前位置和新位置,不改变原来字符串
void CutString(string line,vector &subline,char a){
    //a就是截取的标号
    size_t pos=0;
    while(pos

6.读入用户输入的,以“.”结尾的一行文字,统计一共有多少个单词

2、  #include
3、  #include
4、  int main(){
5、      char s[1000];
6、      int len,a[1000]={0},i,cnt;
7、      gets(s);
8、      len=strlen(s);
9、      printf("len=%d\n",len);
10、     cnt=0;//记录单词数;
11、     i=0;
  //如果是这样计算就不要老想着for循环,while自己i++
12、     while(i

7.找出数组中最长无重复子串的长度

/*
输出一个整数,代表arr的最长无重复字符的长度。
不要和最长公共子串搞混,这个就是自己的子串
*/
#include
using namespace std;
int A[100001];
int main() {
    int n; int length = 0;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> A[i];
    }
    int start = 0; int i = 1;
    while (i < n) {
        int temp = 1;
        for (int j = start; j < i; j++) {
            if (A[j] == A[i]) {
                start = j + 1;
            }
            else {
                temp++;
            }
            if (temp > length)length = temp;
        }
        i++;
    }
    cout << length;
    return 0;
}

方法二:

#include
#include
using namespace std;

int main()
{
    int n;
    cin>>n;
    int *arr = new int[n];

    for(int i = 0; i>temp;

        arr[i] = temp;
    }

    int length =0;
    int left  = 0;
    int right = 0;
    unordered_set rec;

    while (left < n && right < n)
    {
        int cur = arr[right];
        //终于明白了,end()相当于a[n]指向最后一个后一个元素
        if (rec.end() == rec.find(cur))
        {
            rec.insert(cur);
            right++;
            length = (right - left) > length?(right - left):length;
        }
        else
        {   //没有指向最后一个,也就是说找到了!!,这个意思也就是起点需要后移
            //如果一直都是找到的,那么就得一直后移
            rec.erase(arr[left]);
            left++;
        }
    }


    cout<

8.手机键盘按键,find和hash办法

/*
手机键盘
*/
#include 

using namespace std;

int main()
{
    string arr[8]={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};

    string str;
    while(cin>>str){
        int cnt=0;
        for(int i=0;i

好方法:


1其实只需要一个数组就够用了啊。用key顺序记录26个字母按键次数,
2然后判断两个字母是否在同一个按键上,如果在同一个按键上,那么下标差(字母间距)
就等于按键次数差。
#include
#include
using namespace std;
int main()
{
    int key[26] = {1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,4,1,2,3,1,2,3,4};
    string str;
    while(cin>>str)
    {
        int count = key[str[0]-'a'];
        for(int i=1;i

9.给定一个0字符串,求出全部子串出现次数


/*map方法,自动按照字典序增序
使用substr轻松截取子串,为啥老是忘记了!!*/
#include 
#include 
using namespace std;

int main()
{
    string s;
    while(cin>>s){
        map m;
        for(int i=0;i<=s.size();i++){
            for(int j=0;jsecond>1)
                cout<first<<" "<second<

方法二:朴素手写方法

//一前一后两个指针来截取子串

#include 
#include 
#define N 5050

using namespace std;

struct STR{
    string s;
    unsigned cnt;
}buf[N]; //子串集合

int n; //子串数量
string str;  //读取的字符串
string child;  //临时存储子串


void MakeChild(int from,int len){
    child.clear();
    for(int i=0;i>str){
        n=0;  //子串个数
        letsGo();
        sort(buf,buf+n,cmp);
        for(int i=0;i1){
                cout<

你可能感兴趣的:(机试常用算法和题型-字符串专题)