力扣:复原IP地址
?給定一個只包含數字的字符串,復原它并返回所有可能的 IP 地址格式。
示例:
輸入: "25525511135" 輸出: ["255.255.11.135", "255.255.111.35"] const SEG_COUNT = 4var (ans []stringsegments []int )func restoreIpAddresses(s string) []string {segments = make([]int, SEG_COUNT)ans = []string{}dfs(s, 0, 0)return ans }//segStart 對應字符串下標 //segId, 對應段數 func dfs(s string, segId, segStart int) {// 如果找到了 4 段 IP 地址并且遍歷完了字符串,那么就是一種答案//ip地址共4個段if segId == SEG_COUNT {if segStart == len(s) {ipAddr := ""for i := 0; i < SEG_COUNT; i++ {//遍歷這個數組取出IP地址ipAddr += strconv.Itoa(segments[i])if i != SEG_COUNT - 1 {ipAddr += "."}}ans = append(ans, ipAddr)}return}// 如果還沒有找到 4 段 IP 地址就已經遍歷完了字符串,那么提前回溯if segStart == len(s) {return}// 由于不能有前導零,如果當前數字為 0,那么這一段 IP 地址只能為 0if s[segStart] == '0' {segments[segId] = 0dfs(s, segId + 1, segStart + 1)}// 一般情況,枚舉每一種可能性并遞歸addr := 0for segEnd := segStart; segEnd < len(s); segEnd++ {//取出當前的值addr = addr * 10 + int(s[segEnd] - '0')if addr > 0 && addr <= 0xFF {//存儲對應的IP值segments[segId] = addrdfs(s, segId + 1, segEnd + 1)} else {break}} }?
總結
- 上一篇: 算法:不同二叉搜索树||
- 下一篇: 算法:翻转链表||