https://www.toutiao.com/a6675839856192520711/

String 作为最常见的编程语言类型之一,在算法面试中出现的频率极高。

1. 验证回文串

题目来源于 LeetCode 第 125 号问题:验证回文串。这道题目是 初级程序员 在面试的时候经常遇到的一道算法题,而且面试官喜欢面试者手写!

题目描述

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true

示例 2:

输入: "race a car"
输出: false

题目解析

先理解一个概念:所谓回文,就是一个正读和反读都一样的字符串。

先假设是验证一个单词 level 是否是回文字符串,通过概念涉及到 正 与 反 ,那么很容易想到使用双指针,从字符的开头和结尾处开始遍历整个字符串,相同则继续向前寻找,不同则直接返回 false。

而这里与单独验证一个单词是否是回文字符串有所区别的是加入了 空格 与 非字母数字的字符,但实际上的做法一样的:

一开始先建立两个指针,left 和 right , 让它们分别从字符的开头和结尾处开始遍历整个字符串。

如果遇到非字母数字的字符就跳过,继续往下找,直到找到下一个字母数字或者结束遍历,如果遇到大写字母,就将其转为小写。

当左右指针都找到字母数字时,可以进行比较的时候,比较这两个字符,如果相等,则两个指针向它们的前进方向挪动,然后继续比较下面两个分别找到的字母数字,若不相等,直接返回 false。

动画描述

动画描述

代码实现

注:isLetterOrDigit 方法确定指定的字符是否为字母或数字。

class Solution {public boolean isPalindrome(String s) {if(s.length() == 0)return true;int l = 0, r = s.length() - 1;while(l < r){//确定指定的字符是否为字母或数字if(!Character.isLetterOrDigit(s.charAt(l))){l++;}else if(!Character.isLetterOrDigit(s.charAt(r))){r--;}else{if(Character.toLowerCase(s.charAt(l)) != Character.toLowerCase(s.charAt(r)))return false;l++;r--;} }return true;}
}

2. 分割回文串

题目来源于 LeetCode 第 131 号问题:分割回文串。

题目描述

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回 s 所有可能的分割方案。

示例:

输入: "aab"
输出:
[["aa","b"],["a","a","b"]
]

题目解析

首先,对于一个字符串的分割,肯定需要将所有分割情况都遍历完毕才能判断是不是回文数。不能因为 abba 是回文串,就认为它的所有子串都是回文的。

既然需要将所有的分割方法都找出来,那么肯定需要用到DFS(深度优先搜索)或者BFS(广度优先搜索)。

在分割的过程中对于每一个字符串而言都可以分为两部分:左边一个回文串加右边一个子串,比如 "abc" 可分为 "a" + "bc" 。 然后对"bc"分割仍然是同样的方法,分为"b"+"c"。

在处理的时候去优先寻找更短的回文串,然后回溯找稍微长一些的回文串分割方法,不断回溯,分割,直到找到所有的分割方法。

举个:分割"aac"。

  1. 分割为 a + ac
  2. 分割为 a + a + c,分割后,得到一组结果,再回溯到 a + ac
  3. a + ac 中 ac 不是回文串,继续回溯,回溯到 aac
  4. 分割为稍长的回文串,分割为 aa + c 分割完成得到一组结果,再回溯到 aac
  5. aac 不是回文串,搜索结束

动画描述

动画描述

代码实现

class Solution {List<List<String>> res = new ArrayList<>();public List<List<String>> partition(String s) {if(s==null||s.length()==0)return res;dfs(s,new ArrayList<String>(),0);return res;}public void dfs(String s,List<String> remain,int left){if(left==s.length()){ //判断终止条件res.add(new ArrayList<String>(remain)); //添加到结果中return;}for(int right=left;right<s.length();right++){ //从left开始,依次判断left->right是不是回文串if(isPalindroom(s,left,right)){ //判断是否是回文串remain.add(s.substring(left,right+1)); //添加到当前回文串到list中dfs(s,remain,right+1); //从right+1开始继续递归,寻找回文串remain.remove(remain.size()-1); //回溯,从而寻找更长的回文串}}}/*** 判断是否是回文串*/public boolean isPalindroom(String s,int left,int right){while(left<right&&s.charAt(left)==s.charAt(right)){left++;right--;}return left>=right;}
}

3. 单词拆分

题目来源于 LeetCode 第 139 号问题:单词拆分。

题目描述

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

说明:

  • 拆分时可以重复使用字典中的单词。
  • 你可以假设字典中没有重复的单词。

题目解析

与上面的第二题 分割回文串 有些类似,都是拆分,但是如果此题采取 深度优先搜索 的方法来解决的话,答案是超时的,不信的同学可以试一下~

为什么会超时呢?

因为使用 深度优先搜索 会重复的计算了有些位的可拆分情况,这种情况的优化肯定是需要 动态规划 来处理的。

如果不知道动态规划的,可以看一下小吴之前的

万字长文,比较详细的介绍了动态规划的概念。

在这里,只需要去定义一个数组 boolean[] memo,其中第 i 位 memo[i] 表示待拆分字符串从第 0 位到第 i-1 位是否可以被成功地拆分。

然后分别计算每一位是否可以被成功地拆分。

代码实现

class Solution {public boolean wordBreak(String s, List<String> wordDict) {int n = s.length();int max_length=0;for(String temp:wordDict){max_length = temp.length() > max_length ? temp.length() : max_length;}// memo[i] 表示 s 中以 i - 1 结尾的字符串是否可被 wordDict 拆分boolean[] memo = new boolean[n + 1];memo[0] = true;for (int i = 1; i <= n; i++) {for (int j = i-1; j >= 0 && max_length >= i - j; j--) {if (memo[j] && wordDict.contains(s.substring(j, i))) {memo[i] = true;break;}}}return memo[n];}
}

4. 反转字符串

题目来源于 LeetCode 第 344 号问题:反转字符串。面试官最喜欢让你手写的一道算法题!

题目描述

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:

输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:

输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

题目解析

这道题没什么难度,直接从两头往中间走,同时交换两边的字符。注意需要白板编程写出来即可,也注意千万别回答一句使用 reverse() 这种高级函数来解决。。。

动画描述

动画

代码实现

class Solution {
public:string reverseString(string s) {int i = 0, j = s.size() - 1;while (i < j){swap(s[i],s[j]);i++;j--;}return s;}
};

5. 把字符串转换成整数

题目来源于剑指 offer 。

题目描述

将一个字符串转换成一个整数,字符串不是一个合法的数值则返回 0,要求不能使用字符串转换整数的库函数。

题目解析

这道题要考虑全面,对异常值要做出处理。

对于这个题目,需要注意的要点有:

  • 指针是否为空指针以及字符串是否为空字符串;
  • 字符串对于正负号的处理;
  • 输入值是否为合法值,即小于等于'9',大于等于'0';
  • int为32位,需要判断是否溢出;
  • 使用错误标志,区分合法值0和非法值0。

代码实现

public class Solution {public int StrToInt(String str) {if (str == null || str.length() == 0)return 0;boolean isNegative = str.charAt(0) == '-';int ret = 0;for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);if (i == 0 && (c == '+' || c == '-')) /* 符号判定 */continue;if (c < '0' || c > '9') /* 非法输入 */return 0;ret = ret * 10 + (c - '0');}return isNegative ? -ret : ret;}
}

推荐阅读

拜托,面试官别问我「布隆」了

数据结构与算法: 三十张图弄懂「图的两种遍历方式」

昨天,终于拿到了腾讯 offer

几道和「二叉树」有关的算法面试题

几道和散列(哈希)表有关的面试题

一道看完答案你会觉得很沙雕的「动态规划算法题」

几道和「堆栈、队列」有关的面试算法题

链表算法面试问题?看我就够了!

几道 BAT 算法面试中经常问的「字符串」问题相关推荐

  1. 拜托,面试官别问我「布隆」了

    题目描述 一个网站有 100 亿 url 存在一个黑名单中,每条 url 平均 64 字节.这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中? 题目解析 这 ...

  2. 大厂面试官在校招面试中爱问啥?

    如果你在简历中写了这句话,保证能拿到大厂面试机会:扎实的计算机基础,良好的数据结构与算法功底. 然后,你就会被问到头皮发麻. 虽然是段子,但也一定程度上说明了大厂非常注重计算机基础,也是真的喜欢问计算 ...

  3. 数组去重是面试中经常问到的问题

    数组去重是面试中经常问到的问题 [html] view plaincopy var arr=[1,3,4,52,4,5,4,8,7,6]; 第一种方法:使用ES5中的indexOf进行去重: [jav ...

  4. 面试中常问的List去重问题,你都答对了吗?

    面试中经常被问到的list如何去重,用来考察你对list数据结构,以及相关方法的掌握,体现你的java基础学的是否牢固. 我们大家都知道,set集合的特点就是没有重复的元素.如果集合中的数据类型是基本 ...

  5. 去重 属性_面试中常问的List去重问题,你都答对了吗?

    面试中经常被问到的list如何去重,用来考察你对list数据结构,以及相关方法的掌握,体现你的java基础学的是否牢固. 我们大家都知道,set集合的特点就是没有重复的元素.如果集合中的数据类型是基本 ...

  6. java面试 设计模式_Java面试中常问到的设计模式

    面试中常问到的设计模式 什么是设计模式? ​设计模式是世界上各种各样程序员用来解决特定设计问题的尝试和测试的方法.设计模式是代码可用性的延伸 单例模式 ​保证被创建一次,节省系统开销 ​饿汉式:上来不 ...

  7. java io bio nio面试题_漫画:一文学会面试中常问的 IO 问题!

    原标题:漫画:一文学会面试中常问的 IO 问题! 作者 | 漫话编程 责编 | 伍杏玲 本文经授权转载自漫话编程(ID:mhcoding) 周末午后,在家里面进行电话面试,我问了面试者几个关于IO的问 ...

  8. 面试中被问到婚育问题时要怎么回答呢?

    站在企业的角度想,企业既然想出钱招人,肯定是人手不足,需要快速补充人员运转工作,所以,企业在招聘时就要判断在未来一段时间内,你是否有能力和精力跟企业并肩作战.问这个问题,就是为了了解你是否有能力平衡工 ...

  9. 面试题:460道Java后端面试高频题答案版「模块九:Spring」

    Spring 写在前面 相信对于 Spring 这个模块,只要是做过 Java 开发的同学都是不陌生的,或多或少都使用过 Spring 体系的框架.对于平时自己做点小项目会写配置文件可能就行了,但是对 ...

最新文章

  1. Oracle 10g Toad查看 表空间 报错 ORA-00600 internal error code arguments [ktfbhget-4], [6], [5]...
  2. C#各个版本中的新增特性详解
  3. 11月3日云栖精选夜读:《maven实战》读书笔记2——maven安装(windows和eclipse插件)...
  4. UKIEPC 2017
  5. Zero Shot | 一文了解零样本学习
  6. 库、教程、论文实现,这是一份超全的PyTorch资源列表(Github 2.2K星)
  7. 埃夫特机器人离线编程软件_工业机器人离线编程与虚拟仿真软件
  8. 某公司基于FineBI数据决策平台的试运行分析报告
  9. sprintf函数的用法linux,sprintf函数用法解析
  10. KVASER新手入门的常见十一个问题
  11. HTML中font标签中size属性值对应的像素大小
  12. linux下显卡不工作,Ubuntu 12.04下升级Nvidia后Bumblebee无法工作解决
  13. 网站服务器停止运行,服务器已停止响应是怎么回事
  14. codeforces1467E. Distinctive Roots in a Tree
  15. chrome插件实现简单网页实时翻译
  16. UV、PV、IP意思及区别解释
  17. 飞利浦zigbee智能灯泡的软硬件设计
  18. html七彩文本,小程序解析富文本---文本内容(不含图片)
  19. 电子电路测试软件,清华大学出版社-图书详情-《电子电路软件仿真实验教程》...
  20. 获取国家统计局行政区划数据(复制粘贴)

热门文章

  1. java enter_Java UI.enter方法代码示例
  2. 北大林宙辰:追求机器学习研究的美感
  3. 10万元奖金助力AI加速药物研发!小分子预测大赛来啦
  4. 《C#与.NET 3.5高级程序设计(第4版)》有奖书评征集活动
  5. 论如何骗过计算机视觉AI网络,UCLA专家为你支几招
  6. 无向图的最小生成树(克鲁斯卡尔算法 Kruskal)
  7. 周志华教授专著《集成学习:基础与算法》上市,破解AI实践难题
  8. 开放下载!《阿里巴巴大数据及AI实战》深度解析典型场景大数据实践
  9. 独家 | 在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)
  10. DeepMind论文:深度压缩感知,新框架提升GAN性能(附链接)