816. 模糊坐标

816. 模糊坐标

我们有一些二维坐标,如 "(1, 3)" 或 "(2, 0.5)",然后我们移除所有逗号,小数点和空格,得到一个字符串S。返回所有可能的原始字符串到一个列表中。

原始的坐标表示法不会存在多余的零,所以不会出现类似于"00", "0.0", "0.00", "1.0", "001", "00.01"或一些其他更小的数来表示坐标。此外,一个小数点前至少存在一个数,所以也不会出现“.1”形式的数字。

最后返回的列表可以是任意顺序的。而且注意返回的两个数字中间(逗号之后)都有一个空格。

示例 1:

  • 输入: "(123)"
  • 输出: ["(1, 23)", "(12, 3)", "(1.2, 3)", "(1, 2.3)"]

题目链接

模拟

可以遍历逗号的位置将字符串划分为两部分。然后分别对两部分进行处理:

  • 1.无小数点。如果如果只有一位或者第一位不为0。即为合法数
  • 2.有小数点。根据题目要求“原始的坐标表示法不会存在多余的零,所以不会出现类似于"00", "0.0", "0.00", "1.0", "001", "00.01"或一些其他更小的数来表示坐标。”。可以分为小数点左右两部分来讨论
    • 左边部分,考虑是否存在前导零即可。即left[0]=='0'为不合法数
    • 右边部分,判断最后一个数是否为零即可
class Solution {
public:
    //添加小数点
    vector<string>get_part(string s){
        vector<string>res;
        if(s.size()==1||s[0]!='0'){
            res.push_back(s);
        }
        for(int i=1;i<s.size();i++){
            string left=s.substr(0,i);
            string right=s.substr(i,s.size()-i+1);
            if(i!=1&&left[0]=='0')  continue;
            if(right.back()=='0')   continue;
            res.push_back(left+'.'+right);
        }
        return res;
    }

    vector<string> ambiguousCoordinates(string s) {
        vector<string>res;
        //枚举逗号位置
        for(int i=1;i<s.size()-2;i++){
            string pre_s=s.substr(1,i);
            string ord_s=s.substr(i+1,s.size()-i-2);
            vector<string>lefts;
            vector<string>rights;
            lefts=get_part(pre_s);
            rights=get_part(ord_s);
            if(!lefts.empty()&&!rights.empty())
                for(auto left:lefts)
                    for(auto right:rights)
                        res.push_back('('+left+", "+right+')');
        }
        return res;
    }
};
posted @ 2022-11-07 19:00  认真游泳的鱼  阅读(22)  评论(0)    收藏  举报