微软第二题 Composition
一开始时间复杂度为 N*N的做法超时,然后换成C++写了一下还是TLE。
然后换成26*N后AC 了
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int N,M;
static int[][] map;
static int[] numlist;
static String str;
static int res;
static int[] dp;
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int a,b;
while(sc.hasNext()){
N=sc.nextInt();
str=sc.next();
numlist=new int[N];
map=new int[26][26];
dp=new int[26];
for(int i=0;i<N;i++){
numlist[i]=str.charAt(i)-'a';
}
M=sc.nextInt();
for(int i=0;i<M;i++){
str=sc.next();
a=str.charAt(0)-'a';
b=str.charAt(1)-'a';
map[a][b]=1;
map[b][a]=1;
}
for(int i=0;i<N;i++){
if(dp[numlist[i]]>0){
if(map[numlist[i]][numlist[i]]!=1) dp[numlist[i]]=dp[numlist[i]]+1;
}
else dp[numlist[i]]=1;
for(int j=0;j<26;j++){
if(map[numlist[i]][j]!=1&&dp[j]>0&&numlist[i]!=j){
dp[numlist[i]]=Math.max(dp[numlist[i]], dp[j]+1);
}
}
}
res=1;
for(int i=0;i<26;i++){
res=Math.max(res, dp[i]);
}
System.out.println(N-res);
}
}
}


