c++ 字母a~z公升序排列編號 字典序問題 遞迴
問題描述:
***在資料加密和資料壓縮中常需要對特殊的字串進行編碼。給定的字母表a由26個小寫英文本母組成a=。該字母表產生的公升序字串是指字串中字母按照從左到右出現的次序與字母在字母表**現的次序相同,且每個字元最多出現1次。例如,a,b,ab,bc,xyz等字串都是公升序字串。現在對字母表a產生的所有長度不超過6的公升序字串按照字典序排列並編碼如下。
1 2 … 26 27 28 …
a b … z ab ac …
對於任意長度不超過6的公升序字串,迅速計算出它在上述字典中的編碼。***
下面按照實驗步驟解答
實驗報告
問題分析:字典序問題,已知排序規則是位數少的排前面、相同位數按字母表序排列
所以要求出某個公升序字串的位置,一種思路是把該字串前面的數目相加
演算法設計:(1)使用遞迴求出以第i位字母開頭共有k位的字串有多少
(2)求出給出字串所佔位數m,把位數少於m的所有字串相加
(3)加上位數相同但首字元較小的
(4)加上字串中字母與其後面字母之間之間字母開頭的m-i長度字串的數量
3.演算法實現:
f函式為2.(1)的實現
order為(2)(3)(4)的實現
judge判斷是否為a~z公升序字串
5.執行結果圖:
演算法分析:演算法邏輯並不難,把字串之前的相加就行,需要知道哪些情況需要加上,以及通過遞迴實現
經驗歸納:一步步分析,想法上不一定多麼巧妙,難的是需要用**來實現,以及遞迴的邏輯
#include #include #include #include using namespace std;
int f(int i, int k)
else
} return sum;
}//第i個字母開頭長度為k的數量
int order(string str)
} h = str[0] - 'a' + 1;//h為首位字元的位數
//2.加上位數相同但首字元較小的
for (i = 1; i < h; i++)
//3.再加上字串中首字母相同長度相同排在前面的字串的數量
int count = h;
for (i = 1; i < len; i++)
count = h;
} return sum;
}//判斷是否為a~z公升序字串
bool judge(string str)
if (str[i]'z')
}if (str[i]'z')
return true;
}int main()
else
}infile.close();
outfile.close();
return 0;
}
C 正則基礎 A Z 匹配大寫字母
using system using system.text.regularexpressions namespace else console.readkey 0不成功 1不成功 a不成功 b不成功 e成功f成功 不成功 不成功 不成功 感恩曾經幫助過 心少樸 的人。c 優秀,值得學習。正規表示式...
C語言合併兩個帶頭節點公升序排列鍊錶
合併鍊錶,顧名思義,就是將兩個按順序存放資料的鍊錶中的資料合併為用乙個鍊錶儲存,比如在處理多項式的加減法時就需要將兩個多項式的資料進行合併。合併方式有很多種 如果按照儲存方式的不同,可以將兩個鍊錶的資料分別提取出來生成乙個新的鍊錶來儲存原先兩個鍊錶的資料,還可以將其中乙個鍊錶的資料依次插入到另外乙個...
字母的全排列問題(python和C語言實現)
前言 這是乙個經典的問題 設計乙個演算法,輸出乙個字串字元的全排列問題。比如 string abc 輸出是 abc,acb,bac,bca,cba,cab 解法 從集合中依次選出每乙個元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此進行遞迴處理。比如 首先我要列印abc的全排列,就是第一...