题目:
有一个字符串,它包括‘&’、‘=’和小写字母,要求将‘=’左边右边的字符串进行匹配,以‘&’为分隔符,将匹配结果放入一个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。
思路:
用一个指针i去依次遍历,找到&符号就记录下来;
当遇到‘=’时:
保存‘=’左边字符串的值,将上一个‘&’到‘=’的字符串记为str1;
对于‘=’右边的字符串,分三种情况讨论:
a. 当前字符为‘=’且前一个字符不为‘=’
这种情况下就意味着出现了不连续的等号,本次需要被舍弃,同时将i指针移动到下一个&;
b. 当前字符为‘=’且前一个字符为‘=’
这种情况下就是连续的等号,直接略过等号,指针移向下一个字符;
c. 当前字符不为‘=’
将字符保存到str2中。
复杂度为O(n)
class Solution{
public static Map<String,String> findPeakElement(String str) {
Map<String,String>map=new HashMap<>();
int length = str.length();
String s1= "";
String s2="";
char[] chars = str.toCharArray();
int index=0;
for (int i=0;i<length;i++) {
if(chars[i]=='&'){
index=i;
}
if(chars[i]=='=') {
//=左边
s1 = str.substring(index + 1, i);
//=右边
for (int k = i + 1; k < length && chars[k] != '&' ; k++) {
i=k;
if (chars[k] == '=' && chars[k - 1] != '=') {
s2 = "";
while (chars[i+1] != '&' && i+1< length) {
i++;
}
break;
}
if (chars[k] == '=') continue;
s2 += chars[k];
}
if(!s1.isEmpty()&& !s2.isEmpty()){
map.put(s1,s2);
s1="";
s2="";
}
}
}
return map;
}
public static void main(String[] args) {
Map<String, String> map = findPeakElement("&abd=cd&cda===baad&dc=wq");
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> entry : entries) {
System.out.println(entry.getKey()+" "+entry.getValue());
}
}
}
k < length 和 chars[k] != ‘&’ 一起判断时,k < length一定要在前,否则数组下标越界。