LeetCode题解 214. 最短回文串

给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。

示例 1:

输入: "aacecaaa"

输出: "aaacecaaa"

示例 2:

输入: "abcd"

输出: "dcbabcd"

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/shortest-palindrome

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:领取

思路:把给定的字符串的正序`s1`和反序`s2`都分别初始化出哈希数组`h1`,`h2`来,然后进行区间比较,`h1[i,len]`与`h2[1,len-i+1]`,若两区间哈希值相同,就直接返回`s2.substr(0,i-1)+s1`即可

其实没啥思路,我就是套了一个字符串哈希的模板hh。不过这时间不忍直视
```cpp
typedef unsigned long long ull;
const int Pr = 131;
const int maxn = 1e6+10;
class Solution {
public:
int len; string s1,s2;
ull h1[maxn],h2[maxn],p[maxn];

ull get(int l,int r,ull h[]){
return h[r]-h[l-1]*p[r-l+1];
}
void init(){
p[0] = 1;
for(ull i = 1;i<=len;i++){
p[i] = p[i-1]*Pr;
h1[i] = h1[i-1]*Pr + s1[i-1];
h2[i] = h2[i-1]*Pr + s2[i-1];
}
}
string shortestPalindrome(string s) {
len = s.length(),s1 =s,s2 = s;
reverse(s2.begin(),s2.end());
init();
for(int i = 1;i<=len;i++){
if(get(i,len,h2) == get(1,len-i+1,h1)){
return s2.substr(0,i-1)+s1;
}
}
return "";
}
};
```
LeetCode题解 214. 最短回文串

LeetCode题解 抽皮肤

请设计一个抽皮肤算法, 如果玩家往游戏里面充钱越多,则抽中的概率就越大。充钱相同则具有相同的概率。> 注意,游戏玩家数目是动态变化的扩展:- 贵族玩家增加更高的权重w1,即如果之前的概率是p,那么加上贵族之后就是min(1, p * (1 + w1))。比如p是0.5,w1是0.1,那么充了贵族就是min(1, 0.5 * 1.1) = 0.55- 抽…

LeetCode题解 最后剩下谁?

1〜50号运动员按顺序排成一排。教练下令:“单数运动员出列!”剰下的运动员重新排队编号。教练又下令:“单数运动员出列! ”如此下去,最后只剰下一个人,他是几号运动员?如果教练下的令是“双数运动员出列!”最后剰下的又是谁?题解:## 思路如果是双数出列,那么由于1号从来都没有动过,因此剩下的是1号。如果是单数数列,每次剩下的人的编号分别是$2^N$,其中N为轮…

LeetCode题解 链表的冒泡排序

可以使用 https://leetcode-cn.com/problems/sort-list/ 进行测试。 但是本题的要求不是时间复杂度$O(N*logN)$,而是要求使用冒泡排序算法题解:## Python Solution```pythonclass Solution: def sortList(self, head: ListNode) -> …

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制

LeetCode题解统计城市的所有灯泡

这个是我刚毕业的时候,一个真实的面试题,这是一个开放题。题目描述:想办法,将一个城市的所有灯泡数量统计出来。题解:费米估算法1、如果某个城市常驻人口有1000万2、假设每5人居住在一套房里,每套房有灯泡5只,那么住宅灯泡共有1000万只3、假设公众场所每10人共享一只灯泡,那么共有100万只4、主要的这两者相加就得出了1100万只当然实际上这是估算的,具体应…