2020腾讯日常实习二面算法题,&、=字符串匹配

腾讯二面算法题,字符串匹配

怎么都搜不到原题,自己写了写分享给大家~
仅供相互学习和参考~

题目:
有一个字符串,它包括‘&’、‘=’和小写字母,要求将‘=’左边右边的字符串进行匹配以‘&’为分隔符,将匹配结果放入一个map中。

  • 要求兼容&&&(多个分隔符),===(多个等号),=a=b=c(一个字段内出现多个不连续等号)等异常
    1. 例如 :&abd=cd&cda===baad&dc=wq,将abd匹配cd,cda匹配baad,dc匹配wq。
    2. 例如 :&ag=cd=sv&&da=&dc&&&&dav=dwq&,将dav匹配dwq。

先给出我自己的写的代码

map<string, string> Solution(string str) {
    
    
    int index = -1;
    map<string, string> Mp;
    string str1;
    string str2;
    for (int i = 0; i<str.size();i++) {
    
     //从头搜索到尾
        if (str[i] == '&')
            index = i;//记录&的位置
        if (str[i] == '=') {
    
    
            for (int j = index+1; j<i; j++) //左串必定没有=,故直接匹配
                str1 += str[j];
            for (int k = i+1; str[k] != '\0' && str[k] != '&'; k++) {
    
     //右串分三种情况
                i = k;
                if (str[k] == '=' && str[k-1] != '='){
    
    //str[k]为等号且且str[k-1]不为等号,直接break掉
                    str2.clear();
                    while (str[i+1] != '\0' && str[i+1] != '&' ) {
    
     //让i移动到下一个&处
                        i++;
                    }
                    break;
                }
                if(str[k] != '='){
    
    //不为等号就直接赋值
                    str2 += str[k];
                }
            }
            if (str1.empty() || str2.empty()) {
    
    //如果str1或者str2为空,直接下一次循环,不计入map
                str1.clear();
                str2.clear();
                continue;
            }
        }
        Mp[str1] =str2;
        str1.clear();
        str2.clear();
        
    }
    return Mp;
}

int main(){
    
    
    while (true) {
    
    
        string str;
        cin >> str;
        map<string, string> mp = Solution(str);
        map<string, string>::iterator it = mp.begin();
        while (it!=mp.end()) {
    
    
            cout << "key:" << it->first << ", value is :"<< it->second << endl;
            it++;
        }
    }
    return 0;
}

测试结果

&abd=cd&cda===baad&dc=wq //输入
key:, value is :
key:abd, value is :cd //输出
key:cda, value is :baad
key:dc, value is :wq
&ag=cd=sv&&da=&dc&&&&dav=dwq& //输入
key:, value is :
key:dav, value is :dwq //输出

思路:

用一个指针i去依次遍历,找到&符号就记录下来;

当遇到‘=’时:

  1. 保存‘=’左边字符串的值,将上一个‘&’到‘=’的字符串记为str1;

  2. 对于‘=’右边的字符串,分三种情况讨论:

a. 当前字符为‘=’且前一个字符不为‘=’

  • 这种情况下就意味着出现了不连续的等号,本次需要被舍弃,同时将i指针移动到下一个&;

b. 当前字符为‘=’且前一个字符为‘=’

  • 这种情况下就是连续的等号,直接略过等号,指针移向下一个字符;

c. 当前字符不为‘=’

  • 将字符保存到str2中。

复杂度为O(n)

欢迎学习和探讨~

猜你喜欢

转载自blog.csdn.net/zxxkkkk/article/details/109547393