阿里雲高校師生計畫
問題概述:
有一天jerry給tom出了一道題來考驗他。
jerry給了tom乙個長度為2n的只包含小寫字母的字串,讓tom將這個字串任意挑選字元,將其分成兩個等長的字串a和b(對於乙個si不能同時被選到a和b中),然後a要和reverse(b)相同(a和反轉後的b相同),問這樣的方案數有多少?tom有些為難,所以請你來幫幫他吧。
輸入乙個正整數n,和乙個長度為2n的字串。
輸出方案數。
示例1輸入:
2「abba」
輸出:4
所謂挑選n個字元變成a和b兩個字串,是指在原字串中抽出n個字元,這些字元的的順序保持不變,剩下字元的順序也保持不變,由此組成a和b兩個字串。
例如 "abcdef"挑選第2、3、5個字元,則分成 「bce」 和 「adf」 兩個串。
整體框架是dfs,列舉每個字元屬於a還是屬於b,搜尋過程中需要利用a和b的對稱性做加速處理,否則會超時。
比方說xcccddcccxdd
從左往右列舉a字串的構成,如果令第乙個x屬於a,根據對稱性,倒數第三個字元x一定是屬於b;
如此推導出末尾的dd一定屬於a,中間位置的dd一定屬於b,而且是b的頭兩個字元;
然後左邊ccc一定a,右邊ccc一定是b,由此得出1種方案。令第乙個x屬於b也可以用同樣的方式得到1種方案。
用這個思路直接寫**不太好寫,可以通過列舉二進位制,固定左半邊的選擇情況,然後對於每乙個case,通過dfs搜尋右半邊有多少種合法組合,搜尋過程中利用對稱性進行剪枝。
對於字元全部相同case如"aaaaaaaa",因為過程中無法剪枝,會退化成2^(2*n)。對於這種case,答案就是 c(2n,n) ,預判一下直接返回即可。
class
solution
}// 如果都是同樣的字母這種情況
if(issame)
else
for(
int i =
0; i < store.length; i++
)// 可匹配的情況
return
dfs(s, n,"",
0,"")
;}}/**
* 需要的資訊 原始字串,當前加入的位置,當前使用過的字元標記等
* @param s 原始字串
* @param n 一半單詞的數量
* @param left 左半邊的詞
* @param index 當前指向原始字串的位置
* @param right 右半邊的值
* @return 匹配數量
*/private
long
dfs(string s,
int n, string left,
int index, string right)
// system.out.println(t + " " + left);
if(left.
equals
(new
stringbuilder
(right)
.reverse()
.tostring()
))return0;
}for
(int i = index; i <
2* n; i++
)// 統計通過的示例
sum +=
dfs(s, n, left + s.
charat
(i), i +
1, tmpstr);}
// 返回結果到上一層,直到第一層返回給solution方法
return sum;
}/**
** @param up 上標
* @param down 下標
* @return 排列組合數量
*/private
longc(
int up,
int down)
int b =1;
for(
int i = up; i >
0; i--
)return a / b;
}}
阿里雲ECS六
阿里云云伺服器 1 elastic compute service,ecs 是一種處理能力可彈性伸縮的計算服務,其管理方式比物理伺服器更簡單高效。阿里云云伺服器幫助您快速構建更穩定 安全的應用,降低開發運維的難度和整體it成本,使您能夠更專注於核心業務創新。阿里雲伺服器的特點編輯 1,異地多點備份阿...
阿里雲ECS六
阿里云云伺服器 1加粗樣式 elastic compute service,ecs 是一種處理能力可彈性伸縮的計算服務,其管理方式比物理伺服器更簡單高效。阿里云云伺服器幫助您快速構建更穩定 安全的應用,降低開發運維的難度和整體it成本,使您能夠更專注於核心業務創新。阿里阿里雲伺服器的特點編輯 1,異...
使用阿里雲ECS進行深度學習筆記
學生一枚,嘗試一下用阿里雲的gpu伺服器跑深度學習。基本過程參照這篇部落格 記錄一下其中遇到的問題 1.建立完例項檢視一下配置 檢視顯示卡資訊,驅動和cuda版本 nvidia smi 3.建立自定義映象是需要時間的,不要著急釋放例項,確定映象狀態儲存完後再釋放,不然從頭再來,別問我怎麼知道的。4....