LeetCode | 最大长度乘积、替换所有问号

 

目录

318.最大单词长度乘积

1. 题目描述

2. 题解

1567. 替换所有的问号

1. 题目描述

2. 题解


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);
}

输出:

猜你喜欢

转载自blog.csdn.net/weixin_53972936/article/details/124555608