Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
题目一 回文排列
一、题目描述:
给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
回文串不一定是字典当中的单词。
示例 1:
输入:"tactcoa"
输出:true(排列有"tacocat"、"atcocta",等等)
二、思路分析:
这题主要是字符统计,只要相同字符都是偶数个或者奇数字符最多只要一个,那么就可以排列组合成一个回文串。
统计字符可以使用散列表,所以我们可以使用大小为26的数组来统计字符,最后遍历一次判断即可,但是这样需要遍历2次才可以,于是我们可以使用消除法,两两相消。把字符转为字符数组,然后遍历,使用一个set集合来存入字符如果字符再次出现就从集合中删除,最后集合中剩下的就是数量为奇数的字符,判断如果集合大小小于等于1就为可以排列组合为回文串。
三、AC 代码:
class Solution {
public boolean canPermutePalindrome(String s) {
char[] ch = s.toCharArray();
Set<Character> set = new HashSet<>();
for(char c:ch){
if(set.contains(c)){
set.remove(c);
}else{
set.add(c);
}
}
return set.size()<=1;
}
}
题目二 :一次编辑
一、题目描述:
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例 1:
输入: first = "pale" second = "ple"
输出: True
示例 2:
输入: first = "pales"second = "pal"
输出: False
二、思路分析:
这道题是一道中等题,仔细分析示例:
第一种情况:如果两个字符串长度相差大于1,就不可能通过一次编辑使两个字符串相同。
第二种情况:两个字符串长度相同,那么对比两个字符串的各个字符,只能有一处不相同。
第三种情况:如果两个字符串长度相差1,如果删除较长字符串的一个字符或者增加较短字符串一个字符使得两个字符串相等。
主要分析是第三种情况,遍历字符串,如果两个字符不相等,长串的下标向后移动,相当于删除了一个字符,并且记录编辑次数,如果编辑次数大于了1,就返回false了。
三、AC 代码:
class Solution {
public boolean oneEditAway(String first, String second) {
//长度
int fl=first.length();
int sl=second.length();
if(fl-sl>1 || fl-sl <-1) return false;
int df=0;
for(int i=0,j=0;i<fl&&j<sl;i++,j++){
if(first.charAt(i)!=second.charAt(j)){
++df;
if(fl-sl==1){
j--;
}else if(fl-sl==-1){
i--;
}
}
if(df>1) return false;
}
return true;
}
}
总结
以上就是今天的每日刷题打卡,其实很多题目都有简单的高效的技巧,需要仔细分析发现其中的奥秘,欢迎大家一起学习打卡。