暴力解法:
1:在n个数中间加逗号
2:给第一步产生的字符串加小数点(并判断合法),下面是判断规则
if S == "": return []
if S == "0": return [S]
if S == "0XXX0": return []
if S == "0XXX": return ["0.XXX"]
if S == "XXX0": return [S]
return [S, "X.XXX", "XX.XX", "XXX.X"...]
思考:
这题很重要的一点就是归纳出合法规则,同时规则需要优雅,训练我们的抽象能力
注意点与收获:
1:s.substr(i)表示 取从第i个字符直到末尾
2:string::npos 表示size_t的最大值,4294967295(x^32-1)二进制表示与int的-1相同
3:vector数组可以直接使用{}初始化,c++11中{}表示空数组,这个在python表示字典,
有点感觉怪怪的,后来想到c中定义数组可以用int a[]={1,2,3},我就释然了
class Solution {
public:
vector<string> ambiguousCoordinates(string S) {
vector<string> res;
S=S.substr(1,S.size()-2);
for(int i=1;i<S.size();i++){
auto L=gen(S.substr(0,i));
auto R=gen(S.substr(i));
for(string l:L)
for(string r:R){
res.push_back("("+l+", "+r+")");
}
}
return res;
}
vector<string> gen(string s){//长度最小为1
int n=s.size();
if(n<=1)return {s};
if(s[0]=='0'&&s[n-1]=='0')return {};
if(s[0]=='0')return {"0."+s.substr(1)};
if(s[n-1]=='0')return {s};
vector<string> res{s};
for(int i=1;i<n;i++){
res.push_back(s.substr(0,i)+"."+s.substr(i));
}
return res;
}
};