作者:1614221827wwz | 来源:互联网 | 2023-09-13 12:14
题目 93. 复原 IP 地址【中等】
题解 又是回溯法…
下面这句话很重要: 回溯算法事实上就是在一个树形问题上做深度优先遍历 ,因此 首先需要把问题转换为树形问题 。
这题主要利用 indexindex i n d e x 和 startstart s t a r t 两个变量控制DFS
index为IP地址处理到第几个段了&#xff0c;每次&#43;1 start是原始字符串中遍历到第几个字符 class Solution { static final int SEG_NUM&#61; 4 ; List < String > res&#61; new ArrayList < > ( ) ; int [ ] segment&#61; new int [ SEG_NUM] ; public List < String > restoreIpAddresses ( String s) { int n&#61; s. length ( ) ; if ( n< 4 || n> 12 ) return res; dfs ( s, 0 , 0 ) ; return res; } public void dfs ( String s, int index, int start) { int n&#61; s. length ( ) ; if ( index&#61;&#61; SEG_NUM) { if ( start&#61;&#61; n) { StringBuilder str&#61; new StringBuilder ( ) ; for ( int i&#61; 0 ; i< SEG_NUM; i&#43;&#43; ) { str. append ( segment[ i] ) ; if ( i!&#61; SEG_NUM- 1 ) str. append ( &#39;.&#39; ) ; } res. add ( str. toString ( ) ) ; } return ; } else { if ( start&#61;&#61; n) { return ; } if ( s. charAt ( start) &#61;&#61; &#39;0&#39; ) { segment[ index] &#61; 0 ; dfs ( s, index&#43; 1 , start&#43; 1 ) ; } int addr&#61; 0 ; for ( int i&#61; start; i< n; i&#43;&#43; ) { addr&#61; addr* 10 &#43; ( s. charAt ( i) - &#39;0&#39; ) ; if ( addr> 0 && addr<&#61; 255 ) { segment[ index] &#61; addr; dfs ( s, index&#43; 1 , i&#43; 1 ) ; } else return ; } } } }
P.S. StringBuilder
效率是java字符串中最高的&#xff0c;它的append函数有N多重载形式&#xff0c;因此可以直接添加int型变量 &#xff1a;