判定是否互为字符重排
给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
示例 1: 输入: s1 = “abc”, s2 = “bca” 输出: true
示例 2: 输入: s1 = “abc”, s2 = “bad” 输出: false
说明: 0 <= len(s1) <= 100 0 <= len(s2) <= 100 题目来源:https://leetcode-cn.com/problems/check-permutation-lcci/
很明显,尽管可以通过深度优先搜索,将s1中字符排列的情况斗列举,然后将每一种情况都和s2进行比较,从而判断是否互为重排。但是我们通过观察字符串的长度,明显会发生超时,并且即使没有发生超时,也没有必要选择这种复杂的方式实现。 通过仔细观察题目,我们可以发现:如果字符串s1和s2互为字符重排,那么两者的长度相同,并且s2中的所有字符都出现在字符串s1中.基于这个原理,我们可以定义一个数组,用来统计s1字符串中每一个字符出现的次数,然后遍历字符串s2,如果s2遍历到的字符不在s1中(即count为0),直接返回false,否则将对应的次数减1。重复上述操作,直到遍历字符串s2,当遍历完毕后返回true. 对应的代码:
class Solution {
public boolean CheckPermutation(String s1, String s2) {
char[] chars1 = s1.toCharArray();
char[] chars2 = s2.toCharArray();
if(chars1.length != chars2.length)
return false;
int[] count = new int[26];
char ch;
int i;
for(i = 0; i < chars1.length; i++){
count[chars1[i] - 'a']++;
}
for(i = 0; i < chars2.length;++i){
ch = chars2[i];
if(count[ch - 'a'] == 0)
return false;
count[ch - 'a']--;
}
return true;
}
}
运行结果:
URL化
编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)
示例 1: 输入:"Mr John Smith ", 13 输出:“Mr%20John%20Smith”
示例 2: 输入:" “, 5 输出:”%20%20%20%20%20"
提示: 字符串长度在 [0, 500000] 范围内。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/string-to-url-lcci
方法一:利用StringBuilder 1、将字符串转成一个字符数组chars 2、遍历length个字符(因为length才是字符串的真实长度),如果当前下标对应的字符是一个空格,那么在StringBuilder对象调用append方法,添加“%20”,否则,添加这个字符。 3、返回值: StringBuilder对象调用toString()即可. 对应的代码:
class Solution {
public String replaceSpaces(String S, int length) {
char[] chars = S.toCharArray();
StringBuilder sb = new StringBuilder();
int i;
for(i = 0;i < length; ++i){
if(chars[i] != ' '){
sb.append(chars[i]);
}else{
sb.append("%20");
}
}
return sb.toString();
}
}
运行结果:
方法二:利用字符数组进行操作 1、由于已经知道了字符串的真实长度,间接地知道了最后一个不为空格的字符下标,从这个下标开始往左遍历,将这个字符放到字符数组的最后。即 初始两个变量i、j,使得i = chars.length - 1,j = length - 1( j 下标是最后一个不是空格的字符下标,i是字符数组最后一个下标),当chars[ j ]不是空格的时候,直接将chars[ j ]字符赋值给chars[ i ],否则,如果chars[ j ]是一个空格,那么这时候需要将添加的是"%20",因为chars[i–] = ‘0’,chars[i – ] = ‘2’; chars[i – ] = ‘%’; 2、重复上述操作,直到将length个字符已经遍历完了,即j小于0时退出循环。 3、返回值:new String(chars,i + 1,chars.length - i - 1);即将chars中[i + 1,chars.length - 1]共chars.length - 1 - (i + 1) + 1 = chars.length - i - 1个字符构成的子字符串返回。之所以是从下标i + 1开始,是因为当执行到最后一步的时候是chars[i --] = ch,那么这时候i最后依旧进行自减的操作,从而导致新字符串的第一个下标应该是i + 1,而不是i。
对应的代码:
class Solution {
public String replaceSpaces(String S, int length) {
char[] chars = S.toCharArray();
int i,j;
for(i = chars.length - 1,j = length - 1; j >= 0; --j){
if(chars[j] != ' '){
chars[i--] = chars[j];
}else{
chars[i--] = '0';
chars[i--] = '2';
chars[i--] = '%';
}
}
return new String(chars,i + 1,chars.length - i - 1);
}
}
运行结果:
|