问题:
难度:medium
说明:
题目给出一个 (123) 的字符串,括号,里面放一串数字,要求加入一个 , 逗号,然后再选择性放置 . 点符号,把这个字符串改为 (1, 2.3),(1, 23),(1.2, 3),(12, 3) 这样有了点和逗号分割的坐标字符串,不能重复,而且不允许无意义 0 和 点 就是 0.0、0.10、0.、1.、00、00.1 这种都有无意义的 0 和 点 都不能作为结果返回,返回一个 list 包含这些字符串,不用按顺序排列。
题目连接:https://leetcode.com/problems/ambiguous-coordinates/
输入范围:
4 <= s.length <= 12
.s[0]
= "(",s[s.length - 1]
= ")", and the other elements ins
are digits.
输入案例:
Example 1:
Input: s = "(123)"
Output: ["(1, 23)", "(12, 3)", "(1.2, 3)", "(1, 2.3)"]
Example 2:
Input: s = "(00011)"
Output: ["(0.001, 1)", "(0, 0.011)"]
Explanation:
0.0, 00, 0001 or 00.01 are not allowed.
Example 3:
Input: s = "(0123)"
Output: ["(0, 123)", "(0, 12.3)", "(0, 1.23)", "(0.1, 23)", "(0.1, 2.3)", "(0.12, 3)"]
Example 4:
Input: s = "(100)"
Output: [(10, 0)]
Explanation:
1.0 is not allowed.
我的代码:
输入的长度也不长,所以轻松点用全排列,暴力就可以了,加个 stringbuilder 处理更快,
1、先找地方插入 , 逗号
2、校验第一个被分割的数字是否合法
3、如果 2 合法,校验第二个数字是否合法
Java:
class Solution {
public List<String> ambiguousCoordinates(String s) {
s = s.replace("(", "").replace(")", "");
StringBuilder appender = new StringBuilder();
StringBuilder appender2 = new StringBuilder();
List<String> res = new ArrayList<String>();
for(int i = 1, len = s.length(); i < len; i ++) {
String[] nums = new String[]{s.substring(0, i), s.substring(i, len)};
appender.append(nums[0]);
for(int j = 0, len0 = nums[0].length(); j < len0; j ++) {
if(j != 0) appender.insert(j, ".");
if(checkNum(appender.toString())) {
appender2.append(nums[1]);
for(int k = 0, len1 = nums[1].length(), orgLen = appender.length(); k < len1; k ++) {
if(k != 0) appender2.insert(k, ".");
if(checkNum(appender2.toString())) {
res.add(appender.insert(0, "(").append(", ").append(appender2).append(")").toString());
appender.deleteCharAt(0).setLength(orgLen);
}
if(k != 0) appender2.deleteCharAt(k);
}
appender2.setLength(0);
}
if(j != 0) appender.deleteCharAt(j);
}
appender.setLength(0);
}
return res;
}
public boolean checkNum(String num) {
String[] ns = num.split("\\.");
if(ns.length < 2 && num.indexOf(".") != -1) return false;
if(ns[0].length() == 0) return false;
if(ns[0].charAt(0) == '0' && ns[0].length() > 1) return false;
if(ns.length == 2 && (ns[1].length() == 0 || ns[1].charAt(ns[1].length() - 1) == '0')) return false;
return true;
}
}