网易2020秋招开发岗笔试题第一题:最短回文串的变体

7 篇文章 0 订阅
7 篇文章 0 订阅

力扣214题最短回文串题目描述如下:

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

而网易开发岗第一题则是换了种问法:在字符串后面添加字符串将其转换为回文串,找到并返回可以用这种方式转换的最短回文串。

如输入:noon,输出:noon;

输入:noo,输出:noon;

输入:helloworld,输出:helloworldlrowolleh

使用C++编写的代码如下:

#include <iostream>
#include <string>
#include <vector>
#include <stdlib.h>
#include <algorithm>
using namespace std;

string shortestPalindrome(string s)
{
	int n = s.size();//字符串长度
	string rev(s);
	reverse(rev.begin(), rev.end());//反转字符串

	string s_new = rev + "#" + s;//匹配表
	int n_new = s_new.size();//返回匹配表的长度

	vector<int> f(n_new, 0);//创建一个数组,包含n_new个元素,初始化为0,最后一个元素存放rev与s重叠字符的个数

	for (int i = 1; i<n_new; i++)//遍历字符串s_new和数组f
	{
		int t = f[i - 1];

		while (t>0 && s_new[i] != s_new[t])
			t = f[t - 1];
		if (s_new[i] == s_new[t])
			++t;
		
		f[i] = t;
	}

	//return rev.substr(0,n - f[n_new - 1])+s;//f[n_new-1]为数组f的最后一个元素即重叠字符的长度,n-f[n_new-1]为获取子串的长度
	return s + rev.substr(f[n_new-1],n-f[n_new-1]);
}

int main()
{
	string s11 = "noon";
	string s12 = "noo";
	string s13 = "helloworld";
	string s21 = shortestPalindrome(s11);
	string s22 = shortestPalindrome(s12);
	string s23 = shortestPalindrome(s13);
	cout << s21<< endl;
	cout << s22 << endl;
	cout << s23 << endl;

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值