[LeetCode] Ambiguous Coordinates 模糊的坐標


 

We had some 2-dimensional coordinates, like "(1, 3)" or "(2, 0.5)".  Then, we removed all commas, decimal points, and spaces, and ended up with the string S.  Return a list of strings representing all possibilities for what our original coordinates could have been.

Our original representation never had extraneous zeroes, so we never started with numbers like "00", "0.0", "0.00", "1.0", "001", "00.01", or any other number that can be represented with less digits.  Also, a decimal point within a number never occurs without at least one digit occuring before it, so we never started with numbers like ".1".

The final answer list can be returned in any order.  Also note that all coordinates in the final answer have exactly one space between them (occurring after the comma.)

Example 1:
Input: "(123)"
Output: ["(1, 23)", "(12, 3)", "(1.2, 3)", "(1, 2.3)"]
Example 2:
Input: "(00011)"
Output:  ["(0.001, 1)", "(0, 0.011)"]
Explanation: 
0.0, 00, 0001 or 00.01 are not allowed.
Example 3:
Input: "(0123)"
Output: ["(0, 123)", "(0, 12.3)", "(0, 1.23)", "(0.1, 23)", "(0.1, 2.3)", "(0.12, 3)"]
Example 4:
Input: "(100)"
Output: [(10, 0)]
Explanation: 
1.0 is not allowed.

 

Note:

  • 4 <= S.length <= 12.
  • S[0] = "(", S[S.length - 1] = ")", and the other elements in S are digits.

 

這道題給了我們一個模糊坐標,括號里面很只有一個數字字符串,沒有逗號也沒有小數點,讓我們自己添加逗號和小數點,讓把所有可能的組合都返回。題目中給了很多例子,理解起題意來很容易。這道題的難點是如何合理的拆分,很多拆分是不合法的,題目舉了很多不合法的例子,比如 "00", "0.0", "0.00", "1.0", "001", "00.01"。那么我們需要歸納出所有不合法的corner case,然后剩下一般情況比如123,我們就按位加小數點即可。那么我們再來看一下那些非法的例子,我們發現一眼望去好多0,不錯,0就是trouble maker,首先不能有0開頭的長度大於1的整數,比如00, 001。其次,不能有0結尾的小數,比如0.0,0.00,1.0等。還有,小數的整數位上也不能有0開頭的長度大於1的整數。那么我們來歸納一下吧,首先如果字符串為空,那么直接返回空集合。然后如果字符串長度大於1,且首尾字符都是0的話,那么不可分,比如 0xxx0,因為整數長度大於1的話不能以0開頭,中間也沒法加小數點,因為小數最后一位不能是0。如果長度大於1,第一位是0,但最后一位不是0,那我們可以在第一個0后面加個小數點返回,這時就必須要加小數點了,因為長度大於1的整數不能以0開頭。再之后,如果最后一位是0,說明不能加小數點,直接把當前值返回即可。最后就是一般情況了,我們先把原數加入結果res,然后遍歷中間的每個位置,都加個小數點,所有情況歸納如下:

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"...]

 

class Solution {
public:
    vector<string> ambiguousCoordinates(string S) {
        vector<string> res;
        int n = S.size();
        for (int i = 1; i < n - 2; ++i) {
            vector<string> A = findAll(S.substr(1, i)), B = findAll(S.substr(i + 1, n - 2 - i));
            for (auto &a : A) {
                for (auto &b : B) {
                    res.push_back("(" + a + ", " + b + ")");
                }
            }
        }
        return res;
    }
    vector<string> findAll(string S) {
        int n = S.size();
        if (n == 0 || (n > 1 && S[0] == '0' && S[n - 1] == '0')) return {};
        if (n > 1 && 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;
    }
};

 

參考資料:

https://leetcode.com/problems/ambiguous-coordinates/

https://leetcode.com/problems/ambiguous-coordinates/discuss/123851/C%2B%2BJavaPython-Solution-with-Explanation

 

LeetCode All in One 題目講解匯總(持續更新中...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM