当前位置:网站首页 > Java基础 > 正文

java基础字符串教程



第一题-是否全不同

假设字符串是ASCII字符串 

因为码表一共128个元素,所以辅助空间开129个,索引是0~128

可以直接遍历每个字符,取对应的码值作为索引,填入辅助空间内

 

如果不能开辟辅助空间,就只能两层for循环遍历

取到一个元素,就与所有元素作比较,看相不相等

第二题-字符串反转

与这题对应的题有第八题

 

不调用封装函数

 

第三题-字符重新排列

法一

转成字符数组进行排序

 

法二

用每个字符的ASCll码值作为索引进行记录,开辟一个辅助空间,一个数组加,一个数组减,要减的位置如果计数为0,就不用减,直接返回false,因为计数为0就代表上一个字符串没有这个字符。处理完两个数组后,扫描辅助空间,遇到不是0的,返回false

 

第四题-字符串压缩

 

 第五题-字符集是否相同

验证两个字符串的字符集是否相同

ASCII

假设字符串是ASCII字符串 

延用第三题的思路

不管出现几次,只要有就行。所以辅助函数只要记了就行,不用管记几

所以我们保持数组里只有1和0,用来代表有或没有即可

一个字符串用于在辅助数组里加

另一个字符串用来辅助数组里减

最后扫描辅助数组

 

非ASCII

如果不是ASCII码值,就用HashMap,这个通用所有字符集

 

第六题-任意移位包含字符串

两个字符串s1和s2,s2能否被 通过s1作任意移位得到的字符串 包含。

假设字符串是ASCII字符串 

 延用第三题思路

将s1有的字符在辅助函数里记录

再遍历s2,验证s2中字符所在的位置是否被记录过,有记录就减1

只是比第三题少 “最后遍历数组,查看有没有没被减掉的数组” 这一步

注意,当s1 = ABCD , s2 = CDAA时,也是false 

 

第七题-循环移位包含字符串

这个问题还有另一个名字叫:旋转词(s1)

这道题 比第六题多了个限制,就是不能任意移位,只能循环移位

例如题目上的字符串移位

结论: s2是s1+s1的子串

java解法

 

也可以用 如果返回的不是-1,就说明包含子串

 类中的  方法用于返回指定字符或子字符串在此字符串中第一次出现java基础字符串教程处的索引。如果未找到该字符或子字符串,则返回 。也区分大小写

但一般 会比contains慢一点

cpp解法

 

 第八题-按单词反转

 与这题对应的题有第二题

先把整个字符串按字符顺序逆转,调用第二题函数,这样就达到了反转字符串的目的,但不是按单词反转

再按空格分割字符串,数组内的每个元素是一个单词

取出每个单词,因为单词内部也是反转的,所以把单词传进函数再逆转回来后,存入结果字符串

 

第九题-去除连续出现k次的0

字符串是不可变的,所以不可能在原来的字符串上做处理

法一

可以用正则表达式

eg:0{3}代表3个0

 

法二

用StringBuilder 一点一点拼接

取s中的每一个字符,如果是0就计数,不是0就添加

但在添加不是0的字符之前,要把它前面去掉k个0后剩下的0都填进去,再添加不是0的数

用count % k来确定要添加几个0

当有2个连续的0,k=3时,count % k = 2;添加2个0

当有4个连续的0,k=3时,count % k = 1;添加2个1

最后单独处理一下末尾的0,因为非0数不会进行除计数以外的操作

eg:This0a00

判断一下最后一位,如果是0,就再count % k来确定要添加几个0

 

第十题-回文串

回文串:从右往左读和从左往右读,结果是一样的

也就说明,回文串进行反转后,与未反转前相同

利用这个思路,直接将回文串反转,与未反转前作比较即可

 

第十一题-找回文串

造前两位数,后两位就是前两位的倒序

 

第十二题-最短摘要

核心思路:用两个指针指向子串的起始和终止,不断更新,一直指向较小子串

找子串的时候先挪动头指针,直到头指针指向下一个关键字,验证当前子串是否包含全部关键字,没包含就挪动尾指针,直到包含全部关键字,比较长度,比上一个子串短就用另外两个指针存一下索引。

继续向前找,还是先向前挪头指针,挪一格验证一下是不是关键字……

细节:

1、每次挪动都验证是不是关键字,是就要标记一下已存在

用一个和关键字一样长度的数组存是否存在,是(1)否(0)

写一个方法indexOf找元素在关键字数组(keys)中的位置,存在就返回索引,不存在返回-1

用索引去辅助空间对应位置标1

因为辅助空间每个位置存的是1或0,所以对辅助空间求和,与长度相比,就能确定是否全部包含

2、用一个变量记录每个子串的j,用于下一个子串的j的初始化

因为下一个子串的j需要用上一个的j作为起始点向前走

这里的上一个j不是上一个最短子串的j,而是上一个子串的j

下一个子串的j不能用end初始化,因为end存的是上一个最短子串的j,我们需要的是上一个子串的j

3、每一次找新的子串时,需要置空辅助空间

 
 
 

                            

版权声明


相关文章:

  • java基础核心卷12024-10-19 17:42:00
  • java基础对象入门2024-10-19 17:42:00
  • java基础中构造方法2024-10-19 17:42:00
  • java基础21个变量2024-10-19 17:42:00
  • java 基础和数据库2024-10-19 17:42:00
  • java 基础数据类型 引用数据类型2024-10-19 17:42:00
  • java零基础怎么准备秋招2024-10-19 17:42:00
  • 学java基础代码格式2024-10-19 17:42:00
  • java基础知识082024-10-19 17:42:00
  • java反射基础知识2024-10-19 17:42:00