题目描述
小明有26种游戏海报,用小写字母"a"到"z"表示。小明会把游戏海报装订成册(可能有重复的海报),册子可以用一个字符串来表示,每个字符就表示对应的海报,例如abcdea。小明现在想做一些“特别版”,然后卖掉。特别版就是会从所有海报(26种)中随机选一张,加入到册子的任意一个位置。
那现在小明手里已经有一种海报册子,再插入一张新的海报后,他一共可以组成多少不同的海报册子呢?
输入描述:
海报册子的字符串表示,1 <= 字符串长度<= 20
输出描述:
一个整数,表示可以组成的不同的海报册子种类数
示例1
输入
a
输出
51
说明
我们可以组成 'ab','ac',...,'az','ba','ca',...,'za' 还有 'aa', 一共 51 种不同的海报册子。
- 暴力解法
利用C++的STL的set集合的唯一性质可以暴力解决该题,首先先构造出所有情况的字符串,全部放入set中,最后输出大小即可
/*
* @Descripttion:
* @version:
* @Author: iDestro
* @Date: 2020-03-08 20:33:59
* @LastEditors: iDestro
* @LastEditTime: 2020-03-13 22:28:20
*/
#include <iostream>
#include <string>
#include <unordered_set>
using namespace std;
int main() {
string str, str_temp = "0";
cin >> str;
unordered_set<string> s;
for (char c = 'a'; c <= 'z'; c++) {
str_temp[0] = c;
for (int i = 0; i <= str.length(); i++) {
string temp = str;
temp.insert(i, str_temp);
s.insert(temp);
}
}
cout << s.size();
return 0;
}
- 排列组合
根据高中学的插空法,例如ab,有三个位置可以插入,即字符串的长度加1,每个位置可插入26中字母,且当插入与左边或右边字符相同时,会产生重复,如插入a至a的两边,会有一个重复,即ab有两个重复,根据推论可写出
/*
* @Descripttion:
* @version:
* @Author: iDestro
* @Date: 2020-03-13 22:37:42
* @LastEditors: iDestro
* @LastEditTime: 2020-03-13 22:46:31
*/
#include <iostream>
using namespace std;
int main() {
string str;
cin >> str;
cout << (str.length()+1)*26-str.length();
return 0;
}