腾讯二面算法题,字符串匹配
怎么都搜不到原题,自己写了写分享给大家~
仅供相互学习和参考~
题目:
有一个字符串,它包括‘&’、‘=’和小写字母,要求将‘=’左边右边的字符串进行匹配,以‘&’为分隔符,将匹配结果放入一个map中。
- 要求兼容&&&(多个分隔符),===(多个等号),=a=b=c(一个字段内出现多个不连续等号)等异常
- 例如 :&abd=cd&cda===baad&dc=wq,将abd匹配cd,cda匹配baad,dc匹配wq。
- 例如 :&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去依次遍历,找到&符号就记录下来;
当遇到‘=’时:
-
保存‘=’左边字符串的值,将上一个‘&’到‘=’的字符串记为str1;
-
对于‘=’右边的字符串,分三种情况讨论:
a. 当前字符为‘=’且前一个字符不为‘=’
- 这种情况下就意味着出现了不连续的等号,本次需要被舍弃,同时将i指针移动到下一个&;
b. 当前字符为‘=’且前一个字符为‘=’
- 这种情况下就是连续的等号,直接略过等号,指针移向下一个字符;
c. 当前字符不为‘=’
- 将字符保存到str2中。
复杂度为O(n)