目录
318.最大单词长度乘积
1. 题目描述
给你一个字符串数组 words ,找出并返回 length(words[i]) * length(words[j]) 的最大值,并且这两个单词不含有公共字母。如果不存在这样的两个单词,返回 0 。
示例:
2. 题解
(1)暴力破解
思路:遍历所有字符串数组,两两字符串比较,若 其中一个字符串中的字母在另一个字符串中存在则结束此次循环,否则比较当前两个字符串长度之积是否大于已有长度之积,是则更新。
public static int maxProduct(String[] words) {
int Maxnum = 0;
for(int i=0;i<words.length-1;i++) {
for(int j=i+1;j<words.length;j++) {
boolean flag = true;
for(int k=0;k<words[j].length();k++) {//遍历其中一个字符串
if (words[i].contains(String.valueOf(words[j].charAt(k)))) {//判断该字符串中字母是否在另一个字符串中出现
flag = false;
break;
}
}
if(flag && (words[i].length()*words[j].length() > Maxnum)){
Maxnum = words[i].length()*words[j].length();
}
}
}
return Maxnum;
}
输出:
(2) 利用位运算
思路:可知只有小写字母存在,故只有26个字母,所以可以用一个32位的整数表示这26个字母是否在某个字符串中存在,若存在,则相应位置1,最后两两相与,若结果为0(即这两个字符串中没有相同字母)则比较其长度之积是否大于最大值,若是,则更新。
public static int maxProduct_1(String[] words) {
int n = words.length;
int[] hash = new int[n];
int max = 0;
for(int i = 0; i < n; ++i) {
for(char c : words[i].toCharArray()) {
hash[i] |= 1 << (c-'a');
}
}
for(int i = 0; i < n-1; ++i) {
for(int j = i+1; j < n; ++j) {
if((hash[i] & hash[j]) == 0)
max = Math.max(words[i].length() * words[j].length(), max);
}
}
return max;
}
输出;
1567. 替换所有的问号
1. 题目描述
给你一个仅包含小写英文字母和 '?' 字符的字符串 s,请你将所有的 '?' 转换为若干小写字母,使最终的字符串不包含任何 连续重复 的字符。
注意:你 不能 修改非 '?' 字符。
题目测试用例保证 除 '?' 字符 之外,不存在连续重复的字符。
在完成所有转换(可能无需转换)后返回最终的字符串。如果有多个解决方案,请返回其中任何一个。可以证明,在给定的约束条件下,答案总是存在的。
示例:
2. 题解
(1)暴力破解
思路:遍历所有字符,遇到?时遍历从a到z的所有字符,判断其是否与?前后的字符相等,若不是则替换?。
注意:在这里要注意边界值,即当?出现在第一个和最后一个时的情况,还有特殊情况当字符串长度为1,且唯一值为?时的情况,要单独分析。
public static String modifyString(String s) {
StringBuilder ss = new StringBuilder(s);
for(int i=0;i<s.length();i++) {
if(s.charAt(i)=='?') {
if(i>0 && i<s.length()-1) {
for(char j ='a';j<='z';j++) {
if(j != s.charAt(i-1) && j != s.charAt(i+1)) {
ss.setCharAt(i, j); break;
}
}
}
else if (i == 0 && s.length() > 1) {
for(char j ='a';j<='z';j++) {
if(j != s.charAt(i+1)) {
ss.setCharAt(0, j);break;
}
}
}
else if(i == s.length()-1 && s.length() > 1) {
for(char j ='a';j<='z';j++) {
if(j != s.charAt(i-1)) {
ss.setCharAt(s.length()-1, j);break;
}
}
}
else {
ss.setCharAt(s.length()-1, 'a');
}
}
s=ss.toString();
}
return ss.toString();
}
输出:
(2)去边界
思路:前面讲到需要单独判断?出现在边界时的情况,那么我们只需要人为的在该字符串前后分别加上一个字符,那么就不存在边界问题了。,在最后输出或返回时掐头去尾即可。
public static String modifyString_1(String s) {
char[] ss = ('a'+s+'a').toCharArray();
for(int i=1;i<ss.length-1;i++) {
if(ss[i] == '?') {
for(char j = 'a' ;j<='c';j++) {
if(j!= ss[i-1] && j!= ss[i+1]) {
ss[i] = j;break;
}
}
}
}
return String.valueOf(ss, 1, ss.length-2);
}
输出: