题目链接: Leetcode Weekly Contest 258
1、2000. Reverse Prefix of Word
难度:Easy
思路:
模拟即可。
代码:
class Solution {
public String reversePrefix(String word, char ch) {
char[] s=word.toCharArray();
int index=-1;
for(int i=0;i<s.length;i++){
if(s[i]==ch){
index=i;
break;
}
}
if(index!=-1){
int l=0,r=index;
while(l<r){
char temp=s[l];
s[l]=s[r];
s[r]=temp;
l++;
r--;
}
}
return new String(s);
}
}
2、2001. Number of Pairs of Interchangeable Rectangles
难度:Medium
思路:
先用最大公约数对长和宽进行约分,然后将长和宽乘以不同的权重将两者区分开。注意数据溢出。
class Solution {
public long interchangeableRectangles(int[][] A) {
Map<Long,Integer> map=new HashMap<>();
for(int[] a:A){
int factor=gcd(a[0],a[1]);
a[0]/=factor;
a[1]/=factor;
long ans=(a[0]*100001)+a[1];
map.put(ans,map.getOrDefault(ans,0)+1);
}
long res=0;
for(long key:map.keySet()){
long n=map.get(key);//用long防止n*(n-1)溢出
if(n>=2){
res+=(n*(n-1)/2);
}
}
return res;
}
public int gcd(int a,int b) {
if(a%b==0)
return b;
else
return gcd(b,a%b);
}
}
3、2002. Maximum Product of the Length of Two Palindromic Subsequences
难度:Medium
思路:
状态压缩。
代码
class Solution {
public int maxProduct(String s) {
//因为数据量只有12,所以用状态压缩求解
int n=s.length();
int max=(1<<n)-1;//注意优先级,这个括号不能少!!!
int[] f=new int[max+1];
for(int i=1;i<=max;i++){//预处理
StringBuilder sb=new StringBuilder();
for(int j=0;j<n;j++){
if((i>>j&1)>0){
sb.append(s.charAt(j));
//将i转化成所表示的字符串
}
}
if(check(sb)){
f[i]=sb.length();
}
}
int res=0;
for(int i=1;i<=max;i++){
if(f[i]==0){
continue;
}
int k=max^i;//k是i的补集
for(int j=k;j>0;j=(j-1)&k){//枚举k的二进制子集
if(f[j]>0){
res=Math.max(res,f[i]*f[j]);
}
}
}
return res;
}
private boolean check(StringBuilder sb){
//判断sb是否为回文串
int l=0,r=sb.length()-1;
while(l<r){
if(sb.charAt(l)!=sb.charAt(r)){
return false;
}
l++;
r--;
}
return true;
}
}
4、2003. Smallest Missing Genetic Value in Each Subtree
难度:Hard
思路
//暂时不会
代码
//