字符串问题

1.实现一个算法,确定一个字符串的所有字符是否全都不同。假使不允许使用额外的数据结构,又该如何处理?  

一开始, 不妨先问问面试官,上面的字符串是ASCII字符串还是Unicode字符串。这很重要,问这个问题表明你关注细节,并且对计算机科学有深刻了解。ASCII编码的字符集非常有限128字符。为了简单起见,这里假定字符集为ASCII。若不是的话,则需扩大存储空间,不过其余逻辑没有分别。
假定字符集为ASCII,对于这个问题,我们可以做一个简单的优化,若字符串的长度大于字母表中的字符个数,则直接返回false。毕竟,若字母表只有256个字符,字符串里就不可能有280个各不相同的字符。
【算法1】若使用ASCII则使用元素对应下标的方式

【代码】

 注意java封装的方法

【算法2】若不开辟额外空间,则定一个扫其他有没有相等的,时间复杂度是n²

2.翻转字符串

【算法】java不能转成字符数组,因为java中string不可变,因此新建一个字符数组,扫描字符串的每一个字符。字符数组转字符串就用

【代码】

3. 变形词

【问题描述】两个串有相同的字符及数量组成abc abc , abc cba, aabcd bcada;给定两个字符串,确定其中一个字符串的字符重新排列后, 能否变成另一个字符串。这里规定大小写为不同字符,且考虑字符串中的空格。
给定一个string stringA和一 个string stringB, 请返回一个bool, 代表两串是否重新排列后可相同。
测试样例:
"Here you are", "Are you here"
返回: false
【算法1】转为字符数组,排序

【代码】

判断两个数组是否相同用

【算法2】若均为ASCII编码,建立一个计数数组,字符转数组,原字符串加,后字符串减,出现-1直接返回false,最后再扫描一下看是否有大于0的

4.替换空格

【问题描述】请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符(字符串在java中是不可变的,不会动态开放空间,动态增加应使用StringBuilder),并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。给定一个string iniString 为原始的串,以及串的长度int len, 返回替换后的string。
测试样例:
"Mr John Smith”, 13
返回: "Mr%20John%20Smith'
"Hello World", 12
返回: "Hello%20%20World”


【代码】

5.压缩字符串

【问题描述】字符串"aabccccaaa”经压缩会变成“a2b1c5a3"。若压缩后的字符串没有变短,则返回原先的字符串。给定一个string iniString为待压缩的串( 长度小于等于10000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。
【算法】注意边界,最后一个字符

【代码】

6. 判断两个字符串是否由相同的字符组成

【算法1】使用ASCII编码,元素转下标,实现映射

【代码】

【算法2】哈希映射,map<>键值对

【代码】

7.旋转串

【问题描述】给定两个字符串s1和s2,要求判定s2是否能够被通过s1作循环移位得到的字符串包含。例如,给定s1=AABCD和s2=CDAA,返回true;给定s1=ABCD和s2= ACBD,返回false。

【算法】看b+b是不是包含a

【代码】

8.按单词翻转字符串

【问题描述】将字符串按单词翻转,如here you are翻转成are you here

【算法】首先将整个字符串按照字符翻转,再找到每个逆序的单词,将单词翻转

【代码】

9.去掉连续出现k次的0

【算法1】用java自带的方法,正则表达式的方法

【代码】

【算法2】扫描字符数组,算0的个数

【代码】

10.回文串

【代码】

11.最短摘要

【问题描述】给定一段产品的英文描述,包含M个英文单词,每个英文单词以空格分隔,无其他标点符号,目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次) 的长度最短的子串,作为产品简介输出。

【算法】

【代码】

12.字符串匹配之RabinKarp

【算法1】将原始串记为s,模式匹配串记为p。Hash算法,计数方式是Co x 31² +C₁ x 31¹+C₂

【代码】

【算法2】滚动Hash算法

【代码】

13.字符串匹配之KMP

【算法】next数组表示的是针对于匹配串,next[ j ]=k  ---->  j失配,j回溯到k,j=next[j]

如果pj==pk,next(j+1)=k+1或者k<0,next(j+1)=k+1;j++ k++。否则,k继续回溯,直到满足pj==pk或者k<0
【代码】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值