博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dp - 2016腾讯笔试 A
阅读量:5888 次
发布时间:2019-06-19

本文共 2011 字,大约阅读时间需要 6 分钟。

2016腾讯笔试 A 

Problem's Link

 ----------------------------------------------------------------------------

Mean: 

给定一个字符串s,让你从中删除最少的字符,使得剩下的串是一个回文串.

analyse:

仔细想想,发现其实删除和插入都是一个道理(回文的中心对称).

方法1:

  设s'为s的最长回文子串(不是最长连续回文子串),则ans=s.length()-s'.length();

  问题就转化为求s'.length(),可以用最长公共子序列来求,具体方法:

  设rs=reverse(s),则s'.length()就是s和s'的最长公共子序列.

方法2:

  还是动态规划,假设要求解的问题是p(0,n-1),则:

  if(s[0]==s[n-1])

     p(0,n-1)=p(1,n-2);

  else

     p(0,n-1)=min(p(0,n-2),p(1,n-1))+1;

Time complexity: O(N^2)

 

view code

/**<
Mean:
 给定一个字符串s,让你从中删除最少的字符,使得剩下的串是一个回文串.
Analyse:
 仔细想想,发现其实删除和插入都是一个道理(回文的中心对称).
 方法1:
 设s'为s的最长回文子串(不是最长连续回文子串),则ans=s.length()-s'.length();
 问题就转化为求s'.length(),可以用最长公共子序列来求,具体方法:
 设rs=reverse(s),则s'.length()就是s和s'的最长公共子序列.
 方法2:
 还是动态规划,假设要求解的问题是p(0,n-1),则:
 if(s[0]==s[n-1])
     p(0,n-1)=p(1,n-2);
 else
     p(0,n-1)=min(p(0,n-2),p(1,n-1))+1;
*/
#include <bits/stdc++.h>
using
namespace
std;
const
static
int
MAXN
=
1010;
int
dp
[
MAXN
][
MAXN
];
class
Solution
{
public
:
   
int
del_min_char(
string
&s)
   
{
       
int n
=s
.
length();
       
string
rs(n
,
'0');
       
for(
int
i
=
0;
i
<n;
++
i)
           
rs
[
i
]
=s
[n
-
1
-
i
];
       
int
lcs
=
get_lcs(s
,
rs);
       
return s
.
length()
-
lcs;
   
}
   
int
get_lcs(
string
&s
,
string
&
rs)
   
{
       
int n
=s
.
length();
       
for(
int
i
=
0;
i
<=n;
++
i)
       
{
           
for(
int
j
=
0;
j
<=n;
++
j)
               
dp
[
i
][
j
]
=
0;
       
}
       
for(
int
i
=
1;
i
<=n;
++
i)
       
{
           
for(
int
j
=
1;
j
<=n;
++
j)
           
{
               
if(s
[
i
-
1
]
==
rs
[
j
-
1
])
                   
dp
[
i
][
j
]
=
dp
[
i
-
1
][
j
-
1
]
+
1;
               
else
                   
dp
[
i
][
j
]
=
max(
dp
[
i
-
1
][
j
],
dp
[
i
][
j
-
1
]);
           
}
       
}
       
return
dp
[n
][n
];
   
}
private
:
};
class
Solution2
{
public
:
   
int
del_min_char(
string
&s)
   
{
       
int n
=s
.
length();
       
return
solve(s
,
0
,n
-
1);
   
}
   
int
solve(
string
&s
,
int
l
,
int
r)
   
{
       
if(
l
>=
r)
           
return s
[
l
]
==s
[
r
]
?
0
:
1;
       
if(s
[
l
]
==s
[
r
])
           
return
solve(s
,
l
+
1
,
r
-
1);
       
else
           
return
min(
solve(s
,
l
+
1
,
r
),
solve(s
,
l
,
r
-
1))
+
1;
   
}
};
int
main()
{
   
string s;
   
while(
cin
>>s)
   
{
       
Solution
solution;
       
int
ans
=
solution
.
del_min_char(s);
       
cout
<<
ans
<<
endl;
   
}
   
return
0;
}
/**<
test case:
ab -> bab  1
aa -> aa    0
abca -> acbca 1
*/

转载地址:http://lsgix.baihongyu.com/

你可能感兴趣的文章
ABP理论学习之仓储
查看>>
我的友情链接
查看>>
CentOS图形界面和命令行切换
查看>>
HTML5通信机制与html5地理信息定位(gps)
查看>>
加快ALTER TABLE 操作速度
查看>>
PHP 程序员的技术成长规划
查看>>
python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
查看>>
js replace,正则截取字符串内容
查看>>
作业2
查看>>
nginx的信号量
查看>>
云im php,网易云IM
查看>>
DEFERRED_SEGMENT_CREATION
查看>>
Ada boost学习
查看>>
开源 java CMS - FreeCMS2.3字典管理
查看>>
block,inline和inline-block概念和区别
查看>>
移动端常见随屏幕滑动顶部固定导航栏背景色透明度变化简单jquery特效
查看>>
javascript继承方式详解
查看>>
lnmp环境安装sh脚本
查看>>
白话讲反射技术 --- 适合初学者入门引导
查看>>
css变形 transform
查看>>