思路:
pre_index[i]存储的是单词char(i+‘a’)上一次出现的下标,默认为-1,ans[i]存放的是下标为i的单词的当前最短。
将字符串从头扫到尾,当pre_index[]为-1时,ans[pos]=-1,不为-1时,ans[pos]=pos-pre_index[],同时ans[pre_index[]]=min(ans[pre_index[]],ans[pos]),同时注意ans[pre_index[]]是-1的情况。
这题一直超时,我还以为是我方法的问题,搞得我弄了三种解这个题的方法,结果是输入的锅,scanner实在太慢了,换了输入方式后速度快了10倍,
解答:
package bupt;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;
/*
*@author:Totoro
*@createDate:2020年3月17日上午11:08:43
*/
public class 最小距离查询
{
static StringBuilder s;
static int len;
static int[] ans;
static int[] pre_index;
public static void main(String[] args) throws IOException
{
StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
int t;
cin.nextToken();
t=(int)cin.nval;
while(t--!=0)
{
cin.nextToken();
s=new StringBuilder(cin.sval);
init(s);
int n;
cin.nextToken();
n=(int)cin.nval;
String sql;
while(n--!=0)
{
cin.nextToken();
sql=cin.sval;
if(sql.charAt(0)=='I')
{
cin.nextToken();
char cr=cin.sval.charAt(0);
Insert(cr-'a',len);
s.append(cr);
++len;
}
else
{
cin.nextToken();
System.out.println(ans[(int)cin.nval]);
}
}
}
}
public static void Insert(int cr,int pos)
{
if(pre_index[cr]==-1)
ans[pos]=-1;
else
{
ans[pos]=pos-pre_index[cr];
int pre_ans=ans[pre_index[cr]];
if(pre_ans==-1)
ans[pre_index[cr]]=ans[pos];
else
ans[pre_index[cr]]=Math.min(pre_ans,ans[pos]);
}
pre_index[cr]=pos;
}
public static void init(StringBuilder sentence)
{
pre_index=new int[26];
Arrays.fill(pre_index,-1);
ans=new int[200005];
len=sentence.length();
int cr;
for(int i=0;i<len;++i)
{
cr=sentence.charAt(i)-'a';
Insert(cr,i);
}
}
}