Java 在字符串中查找置换的索引
我刚刚尝试了一个编程挑战,但未能成功完成。规格是从Java 在字符串中查找置换的索引,java,Java,我刚刚尝试了一个编程挑战,但未能成功完成。规格是从系统中读取2行输入 由1-100个空格分隔的单词组成的列表,所有单词长度相同,长度在1-10个字符之间 一个长度不超过一百万个字符的字符串,其中只包含一次上述列表的排列。返回此排列在字符串中开始位置的索引 例如,我们可能有: dog cat rat abcratdogcattgh 3 其中,3是结果(由System.out打印) 列表中有重复的单词是合法的: dog cat rat cat abccatratdogzzzzdogcatratca
系统中读取2行输入
由1-100个空格分隔的单词组成的列表,所有单词长度相同,长度在1-10个字符之间
一个长度不超过一百万个字符的字符串,其中只包含一次上述列表的排列。返回此排列在字符串中开始位置的索引
例如,我们可能有:
dog cat rat
abcratdogcattgh
3
其中,3
是结果(由System.out
打印)
列表中有重复的单词是合法的:
dog cat rat cat
abccatratdogzzzzdogcatratcat
16
如果答案开头的单词以前没有出现过,我生成的代码就起作用了。在这里的第二个例子中,我的代码将失败,因为dog
已经出现在答案从索引16开始的地方
我的理论是:
查找字符串中每个单词出现的索引
提取此子字符串(因为我们有许多已知长度的已知单词,这是可能的)
检查所有单词是否出现在子字符串中
如果是,则返回该子字符串出现在原始字符串中的索引
这是我的代码(应该是可编译的):
导入java.io.BufferedReader;
导入java.io.InputStreamReader;
公共类解决方案{
公共静态void main(字符串[]args)引发异常{
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
String line=br.readLine();
字符串[]l=line.split(“”);
字符串s=br.readLine();
int wl=l[0]。长度();
int len=wl*l.长度;
int sl=s.length();
for(字符串字:l){
int i=s.indexOf(单词);
int z=i;
//而(i!=-1){
int y=i+len;
if(y如果将字符串连接在一起并使用新字符串进行搜索
String a = "dog"
String b = "cat"
String c = a+b; //output of c would be "dogcat"
这样你就能克服狗在某处出现的问题
但是如果catdog也是一个有效的值,这就不起作用了。这里有一种方法(伪代码)
完成后,您将拥有一系列索引(匹配首字母的位置)。现在是棘手的部分。由于单词都是相同长度的,我们正在寻找一系列索引,它们在10个不同的“集合”中以相同的方式间隔。这有点乏味,但它应该在有限的时间内完成。请注意,这样做比持续比较字符串更快(比较数字显然比确保匹配完整字符串更快)。我会再次将其分为两部分-首先查找“10个匹配的任意序列”,然后“看看这是否是一个独特的排列”
我希望这能让你开动脑筋。也许不是最好的优化版本,但是下面的理论能给你一些想法吗:
计算行中所有单词的长度
从列表中随机抽取一个单词,并找到其第一个单词的起始索引
发生
取一个子串,其长度在该子串前后进行计数
索引(例如,如果索引为15,3个单词4个字母长,则采用
从15-8到15+11的子串)
在删除先前随机单词的情况下复制单词列表
检查[word_length]的附加/前置字母,查看它们是否正确
在列表中匹配一个生词
若word与列表副本匹配,则将其从列表副本中删除并进一步移动
如果找到所有单词,则断开循环
如果未找到所有单词,请查找下一次出现的单词的起始索引
前面的随机词,返回到3
为什么会有帮助:
- 你选择哪个词开头并不重要,因为每个词
无论如何都需要参加成功的比赛
- 您不必手动循环许多字符,
除非有很多近乎完全的错误匹配
- 随着假设匹配的不断增长,列表副本上剩下的可供比较的单词越来越少
- 还可以跟踪您访问过的最远索引,以便
有时限制拾取的子字符串的向后长度(因为
如果发生错误,则不能与您已经去过的地方重叠
彼此靠近)
因为任何排列都可以,所以这并没有真正的帮助。
String a = "dog"
String b = "cat"
String c = a+b; //output of c would be "dogcat"
stringArray keys(n) = {"cat", "dog", "rat", "roo", ...};
string bigString(1000000);
L = strlen(keys[0]); // since all are same length
int indices(n, 1000000/L); // much too big - but safe if only one word repeated over and over
for each s in keys
f = -1
do:
f = find s in bigString starting at f+1 // use bigString.indexOf(s, f+1)
write index of f to indices
until no more found
sIndx = sort(indices(:))
dsIndx = diff(sIndx);
sequence = find {n} * 10 in dsIndx
for each s in sequence
check if unique permutation