每天一道面试题(四)
2013-11-04 10:37
211 查看
(唯品会·2014南京)给定字符串,可以通过插入字符,使其变成回文,求最少插入字符的数量。例如:ab最少插入1个字符,变为bab;aa最少插入0个字符;abcd最少插入3个字符,dcbabcd。
分析:首尾指针法——设两个指针pBegin和pEnd分别指向字符串的首尾,比较首尾指针指向的值,这时会有种情况:
1)*pBegin==*pEnd 则二者均向中间移动,即pBegin++;pEnd--;
2)*pBegin!=*pEnd,则有两种处理方法:一、在pEnd后插入和*pBegin相等的字符,然后pBegin++继续比较,统计剩余字符插入数量;二、在pBegin钱插入和*pEnd相等的字符,然后pEnd--继续比较,统计剩余字符插入数量。最少插入字符的数量即为一和二两种情况的最小者。
重复上面的过程,直到pBegin和pEnd相遇。
代码:
分析:首尾指针法——设两个指针pBegin和pEnd分别指向字符串的首尾,比较首尾指针指向的值,这时会有种情况:
1)*pBegin==*pEnd 则二者均向中间移动,即pBegin++;pEnd--;
2)*pBegin!=*pEnd,则有两种处理方法:一、在pEnd后插入和*pBegin相等的字符,然后pBegin++继续比较,统计剩余字符插入数量;二、在pBegin钱插入和*pEnd相等的字符,然后pEnd--继续比较,统计剩余字符插入数量。最少插入字符的数量即为一和二两种情况的最小者。
重复上面的过程,直到pBegin和pEnd相遇。
代码:
int minChange(char *str,char *pBegin,char *pEnd) { if (str==NULL||pBegin==NULL||pEnd==NULL) { return -1; } else if (*str=='\0'||pBegin>=pEnd) { return 0; } else { //*pBegin==*pEnd 则二者均向中间移动,即pBegin++;pEnd--; while (pBegin<pEnd&&*pBegin==*pEnd) { pBegin++; pEnd--; } //*pBegin!=*pEnd,判断是在pBegin前插入还是在pEnd后插入 if (pBegin<pEnd) { int min1=minChange(str,pBegin,pEnd-1); int min2=minChange(str,pBegin+1,pEnd); return min1<min2?min1+1:min2+1; }else { return 0; } } }
相关文章推荐
- 每天一道面试题(一)
- 每天一道面试题(TCP/IP)
- 每天一道面试题,为今年找工作早做准备!笨鸟先飞,哈哈(2012年2月篇)
- 【每天一道面试题】开篇
- 每天一道面试题,为今年找工作早做准备!笨鸟先飞,哈哈(2012年4月篇)
- 每天一道面试题(六)
- 每天一道面试题,为今年找工作早做准备!笨鸟先飞,哈哈(2012年1月篇) .
- 每天一道前端面试题--throttle与debounce
- 每天一道面试题,为今年找工作早做准备!笨鸟先飞,哈哈(2012年3月篇) . .
- 每天一道面试题,为今年找工作早做准备!笨鸟先飞,哈哈(2012年1月篇) .
- 每天一道面试题(1)~~~
- 2015年3月20号-----每天一道面试题
- 每天一道面试题(1):快速排序
- 每天一道面试题(2):实现strncpy
- 每天一道面试题(三)
- 每天一道面试题,为今年找工作早做准备!笨鸟先飞,哈哈(2012年5月篇)
- 每天一道面试题,为今年找工作早做准备!笨鸟先飞,哈哈(2012年1月篇) .
- 每天一道面试题(二)
- 每天一道leetcode 现在离小贱锋距离还很远 要继续加油!fighting!
- 【每天一道编程系列-2018.2.21】(Ans)