老样子,先上题目:
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 '.' 分隔。
示例:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/restore-ip-addresses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
题目看上去比较难,但其实思路比较简单。在这里直接使用暴力破解即可23333333:
因为要分割成四段,所以需要三重循环即可,逐个遍历。
时间复杂度为O(n^3),空间复杂度为O(1)
应该还有复杂度更加低的方法,本人比较菜,所以这里不扩展了233333
实现:(又一次感受到了java与c++/c之间的速度之差555)
JAVA版:
package leetcode;
import java.util.ArrayList;
import java.util.List;
/*
USER:LQY
DATE:2020/8/9
TIME:8:31
*/
public class leetcode_93 {
public static void main(String []args){
String s = "25525511135";
List<String> ans = new leetcode_93().restoreIpAddresses(s);
for(String d : ans){
System.out.println(d);
}
}
public List<String> restoreIpAddresses(String s) {
List<String> ans = new ArrayList<>();
int n = s.length();
if(n < 4) return ans;
if(n == 4){
String t = "";
for(int i = 0;i < n-1;i++)
t += s.charAt(i) + '.';
t += t.charAt(n-1);
ans.add(t);
return ans;
}
// int []index = {1, 2, 3};
System.out.println("start");
for(int i = 1;i<=3 && i<n;i++){
String s1 = s.substring(0, i);
if(Integer.valueOf(s1) > 255) {
System.out.println("s1 "+s1+" out of the range");
// break;
continue;
}
for(int j = i+1;j<=i+3 && j<n;j++){
String s2 = s.substring(i, j);
if(Integer.valueOf(s2) > 255) {
System.out.println("s2 "+s2+" out of the range");
// break;
continue;
}
for(int k = j+1;k<=j+3 && k<n;k++){
String s3 = s.substring(j, k);
if(n-k > 3) continue;
String s4 = s.substring(k, n);
if(s3=="" || s4=="" || Integer.valueOf(s3)>255 || Integer.valueOf(s4)>255) {
System.out.println("s3 "+s3+" or s4 "+s4+" out of the range");
// break;
continue;
}
if(!judge(s1) || !judge(s2) || !judge(s3) || !judge(s4)) continue;
//此时添加
String t = "";
for(int m = 0;m < n;m++){
if(m==i-1 || m==j-1 || m==k-1){
t += s.charAt(m) + ".";
}else{
t += s.charAt(m);
}
}
System.out.println("get:"+t);
ans.add(t);
}
}
}
return ans;
}
boolean judge(String s){
int n = s.length();
if(n==2 && Integer.valueOf(s)<10) return false;
if(n==3 && Integer.valueOf(s)<100) return false;
return true;
}
}
C++版:
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> ans;
int n = s.size();
if(n < 4) return ans;
if(n == 4){
string t = "";
for(int i = 0;i < n-1;i++){
t += s[i];
t += '.';
}
t += s[n-1];
ans.push_back(t);
return ans;
}
// c++中的stubstr(p1, p2)与java中的不一样,
// c++中的p1指示起始位置,p2指示字符数目。
// 即从p1处开始的p2个字符。
for(int i = 1;i<=3 && i<n;i++){
string s1 = s.substr(0, i);
if(stol(s1) > 255){
// cout<<"s1 "<<s1<<" out of the range"<<endl;
continue;
}
for(int j = i+1;j<=i+3 && j<n;j++){
string s2 = s.substr(i, j-i);
if(stol(s2) > 255){
// cout<<"s2 "<<s2<<" out of the range"<<endl;
continue;
}
for(int k = j+1;k<=j+3 && k<n;k++){
string s3 = s.substr(j, k-j);
if(n-k > 3) continue;
string s4 = s.substr(k, n-k);
if(stol(s3)>255 || stol(s4)>255){
// cout<<"s3 "<<s3<<" or s4 "<<s4<<" out of the range"<<endl;
continue;
}
if(!judge(s1) || !judge(s2) || !judge(s3) || !judge(s4)) continue;
// cout<<"add"<<endl
string t = "";
for(int m = 0;m < n;m++){
if(m==i-1 || m==j-1 || m==k-1){
t += s[m];
t += ".";
}else{
t += s[m];
}
}
cout<<t;
ans.push_back(t);
}
}
}
return ans;
}
bool judge(string s){
int n = s.size();
if(n==2 && stol(s)<10) return false;
if(n==3 && stol(s)<100) return false;
return true;
}
};