这道题典型的暴力枚举,就是有点复杂罢了。可能刚开始想的时候会很痛苦,其实理清楚思路之后就好了,思路很简单,但是要想实现的话需要一定的编程能力,这道题其实考的并不是什么知识点,就是考验自己的编程能力的。所以这道题你可以想到,但是不一定做到,这是这道题的本质。
思路:
1.首先就是需要去除括号,这对我们判断坐标没有一点用。
2.你可以选择判断只有“, ”加入的情况,然后再去考虑“."加入的情况,或者先考虑“.”加入的情况,之后再考虑加入“, ”的情况。这里就用后者的判断做个例子。
3.先判断加入小数点的情况。第一,特殊情况:如果小数点左边有0,那么左边当且仅当只有一个0的时候才能构成一个符合条件的数字,即当字符串第一个位置是0的时候,只有在第二位加入小数点才符合题意,其他的不行;如果字符串只有一个0,直接返回结果就行了。第二,普遍情况:如果字符串的第一位不是0,那么小数点除了加在最后一位后面或者第一位前面,其他位置随便。
4.OK,那么之后就开始判断在加入小数点的基础之上加入逗号和空格的情形(逗号和空格是一起的,所以不要忽视)。首先,加入小数点的地方不能插入,第一个位置之前和最后一个位置之后不行。其次就是合法位置的判断:我们可以把字符串分为左右两部分进行判断,这里运用了string类型中的一个函数用法,就是substr(),这个函数可以了解一下,就是截取字符串的子串的,很方便。
上代码:
class Solution {
public:
vector<string>have_xiaoshu(string s){
vector<string>res;
if(s[0]!='0'||s=="0")
res.push_back(s);
for(int i=1;i<s.size();i++){
if(i!=1&&s[0]=='0'||s.back()=='0')continue;//对开头是0的字符串进行筛选
res.push_back(s.substr(0,i)+"."+s.substr(i));
}
return res;
}//初步判断对于原字符串去掉括号之后,只加入‘.‘的情形
vector<string> ambiguousCoordinates(string s) {
int n=s.size()-2;
vector<string>res;
s=s.substr(1,s.size()-2);//变相的去掉括号
for(int i=1;i<n;i++){
vector<string>left=have_xiaoshu(s.substr(0,i));
if(left.empty())continue;
vector<string>right=have_xiaoshu(s.substr(i));
if(right.empty())continue;
for(auto&it:left){
for(auto&j:right){
res.push_back("("+it+", "+j+")");
}
}
}
return res;
}
};