第七章 回溯演算法part03

晴夜空發表於2024-07-18

第七章 回溯演算法part03

93.復原IP地址 78.子集 90.子集II

93.復原IP地址

題目地址 :

93. 復原 IP 地址 - 力扣(LeetCode)

Code ( 複用 了 131.分割回文串 的 程式碼 , 同時 對 Component 的 處理 方向 、 遍歷 ,/ 選取 方式、 新增 條件 進行 了 調整 , 對 Cache 字串 的 拼接 ,/ 修剪 維護 進行 了 調整 尤其 是 新增 '.' 分隔 符 後 , Component 的 左 邊界 下標 可以 快速 提供 字串 在 修剪 時 需要 的 一部分 長度 資訊 與 前段 形成 '.' 的 數量 形成 長度 資訊 ) :

class Solution {
public:
struct Struct_Edge_Left_String_Edge_Right
{
int edge_Left ;
string str_SubStr ;
int edge_Right ;



};
vector<string> restoreIpAddresses(string s) {

int length_s = s.length() ;


// 子串 在 這裡 可以 重複

// It ' s different


// seed 位 / 發芽 的 位置



// 迴文 串 資訊 的 建立

vector<vector<Struct_Edge_Left_String_Edge_Right>> vec_Info_SubStr(length_s , vector<Struct_Edge_Left_String_Edge_Right>(0)) ;



// IP 段 的 新增
for(int i = ( length_s - 1 ) ; i >= 0 ; i-- )
{
int edge_Right = i ;
int edge_Left ;

string str_Temp_Cache = "";

//cout<< " i = " << i << endl ;

for(int j = 0 ; j < 3 ; j ++ )
{
edge_Left = i - j ;

//cout<< " j = " << j << endl ;

if( ( i - j ) < 0 )
{
break ;

}

if(s[i - j ] < 0x30 || s[i - j ] >= 0x40 )
{
break ;

}

if(j == 1 && s[i - j ] == '0')
{

str_Temp_Cache = s[ (i - j) ] + str_Temp_Cache ;

continue ;

}

if(j == 2 )
{
if(s[i - j ] == '0')
{

break ;


}

if(s[i - j ] > '2')
{

break ;


}

// cout<< "s[ (i - j ) + 1 ] = " << s[ (i - j ) + 1 ] << endl ;

// cout<< "s[ (i - j ) + 2 ] = " << s[ (i - j ) + 2 ] << endl ;

// if(s[ (i - j ) + 1 ] == '5')
// {
// cout<<"s[ (i - j ) + 1 ] == '5' : "<< "true" <<endl;
// }

// if(s[ (i - j ) + 2 ] > '5')
// {
// cout<<"s[ (i - j ) + 2 ] > '5' : "<< "true" <<endl;
// }

if(s[ (i - j ) ] == '2' && ( (s[ (i - j ) + 1 ] > '5' ) ) )
{


break ;


}

if(s[ (i - j ) ] == '2' && ( ( s[ (i - j ) + 1 ] == '5' && s[ (i - j ) + 2 ] > '5') ) )
{


break ;


}

// if(s[ (i - j ) ] == '2' && ( (s[ (i - j ) + 1 ] > '5' ) || ( s[ (i - j ) + 1 ] == '5' && s[ (i - j ) + 2 ] > '5') ) )
// {


// break ;


// }


}


str_Temp_Cache = s[ i - j ] + str_Temp_Cache ;

Struct_Edge_Left_String_Edge_Right struct_Edge_Left_String_Edge_Right_Temp ;

struct_Edge_Left_String_Edge_Right_Temp.edge_Left = edge_Left ;
struct_Edge_Left_String_Edge_Right_Temp.edge_Right = edge_Right ;

struct_Edge_Left_String_Edge_Right_Temp.str_SubStr = str_Temp_Cache ;


vec_Info_SubStr[edge_Left].push_back(struct_Edge_Left_String_Edge_Right_Temp) ;

//cout<<"struct_Edge_Left_String_Edge_Right_Temp.str_SubStr = " << struct_Edge_Left_String_Edge_Right_Temp.str_SubStr << endl ;





}





}





// 存到 以 左 起始點 為 下標 的 向量 中 , 結構體 包含 : 左 起始 下標 , 字串 資訊 , 右 結束 下標 / 右 邊界



//vector< vector<string>> vec_2_Dimention_For_Receive_And_Return ;

//vector<string> vec_Str_For_Temp_Cache ;



vector< string > vec_Str_For_Receive_And_Return ;

string str_For_Temp_Cache = "" ;




//cout<< 11111111111<< endl ;


// 嘗試 使用 迴文 字串 拼 出 “ 成 串 ” / “ 原本 整個 的 字串 ”


fuction_Recursion_For_SpliceWholeStr( 0 , length_s , 1 , vec_Info_SubStr , vec_Str_For_Receive_And_Return , str_For_Temp_Cache ) ;






return vec_Str_For_Receive_And_Return ;









}


void fuction_Recursion_For_SpliceWholeStr( int i_Edge_Left , int & length_s , int num_Segment , vector<vector<Struct_Edge_Left_String_Edge_Right>> & vec_Info_SubStr , vector< string > & vec_Str_For_Receive_And_Return , string & str_For_Temp_Cache )
{
//cout<<" str_For_Temp_Cache = " << str_For_Temp_Cache << endl ;

if(num_Segment > 4 )
{

return ;



}
else
{



}


if(i_Edge_Left >= length_s)
{
return ;
}
else
{

}

for(int i = 0 ; i < vec_Info_SubStr[i_Edge_Left].size() ; i++ )
{

if( ( vec_Info_SubStr[i_Edge_Left][i].edge_Right ) == (length_s - 1 ) )
{

str_For_Temp_Cache += vec_Info_SubStr[i_Edge_Left][i].str_SubStr ;

//

if(num_Segment != 4 )
{


}
else
{

vec_Str_For_Receive_And_Return.push_back(str_For_Temp_Cache) ;

//cout<<" str_For_Temp_Cache = " << str_For_Temp_Cache << endl ;


}











str_For_Temp_Cache = str_For_Temp_Cache.substr(0, ( ( ( (vec_Info_SubStr[i_Edge_Left][i].edge_Left) + 1 ) - 1 ) + ( num_Segment - 1 ) ) ) ;







}
else if( ( vec_Info_SubStr[i_Edge_Left][i].edge_Right ) > (length_s - 1 ))
{




continue ;


}
else if( ( vec_Info_SubStr[i_Edge_Left][i].edge_Right ) < (length_s - 1 ))
{

//cout<<"vec_Info_SubStr[i_Edge_Left][i].str_SubStr = " << vec_Info_SubStr[i_Edge_Left][i].str_SubStr <<endl ;

str_For_Temp_Cache += vec_Info_SubStr[i_Edge_Left][i].str_SubStr + "." ;

//

//cout<<" str_For_Temp_Cache = " << str_For_Temp_Cache << endl ;

// “ 下 一 個 ”
fuction_Recursion_For_SpliceWholeStr( ( vec_Info_SubStr[i_Edge_Left][i].edge_Right + 1 ) , length_s , (num_Segment + 1 ) , vec_Info_SubStr , vec_Str_For_Receive_And_Return , str_For_Temp_Cache ) ;



str_For_Temp_Cache = str_For_Temp_Cache.substr(0, (( ( ( vec_Info_SubStr[i_Edge_Left][i].edge_Left) + 1 ) - 1 ) + ( num_Segment - 1 ) ) ) ;



}




}










}





};

相關文章