RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1431375
Accepted
Pavel
Pavel
Asked:2022-07-20 14:47:27 +0000 UTC2022-07-20 14:47:27 +0000 UTC 2022-07-20 14:47:27 +0000 UTC

在字符串数组中的相同位置查找字符

  • 772

我有一个算法,我无法挤出任何与答案近似的东西,所以这只是一个任务。

给定一个字符串数组S。N每条线的长度相同M。任务是在数组中找到一对字符串,S其中两个字符串在同一位置具有相同的字母。

例如:

S = ["abc", "bea", "dbe'],第 0 行"abc"和第 2 行在位置 1"dbe"具有相同的字母"b"。另一方面,对于字符串“abc”和“bea”,它们没有相同字母的位置。如果没有这样的对,该函数应该返回一个空数组。如果有多个正确答案,该函数可能会返回其中任何一个。

结果是一个由三个整数组成的数组。前两个整数是S 属于该对的字符串的索引。第三个整数是普通字母的位置。

更多示例:

S = ["abc", "bea", "dbe"]结果:[0, 2, 1]。另一个正确答案是[2, 0, 1],因为行索引的顺序无关紧要。

S = ["abc", "bca", "dbe"]->[0, 2, 1]

S = ["zzzz", "ferz", "zdsr", "fgtd']可以返回[0, 1, 3]since "zzzz",并且"ferz"在"z"位置 3。该函数还可以返回将按字母[1, 3, 0]匹配字符串。"ferz", "fgtd""f"

S = ["gr", "sd", "rg"]必须返回[],因为没有符合条件的行对

S = ["bdafg", 'ceagi']该函数应该返回[0, 1, 2]

为以下假设编写一个有效的算法:

  1. N它int在 [1..30000] 范围内;
  2. M它int在 [1..2000] 范围内;
  3. 每个元素S仅由小写拉丁字母 (az) 组成;
  4. N * M < 30,000。
алгоритм java
  • 2 2 个回答
  • 112 Views

2 个回答

  • Voted
  1. Best Answer
    had0uken
    2022-07-20T17:15:42Z2022-07-20T17:15:42Z

    我是这样决定的:(结果相当“笨拙地 - 休息”,但您问题中的所有示例都正确通过)。我在代码中添加了注释,但如果有些地方不清楚,请询问。实际上,我将任务分为 3 个任务:每个任务都是计算输出数组元素之一。从最后一个元素开始,以零结束。

    1)搜索重复的索引。考虑到问题条件下数组中的所有字符串都具有相同的长度,我将每个 0 字符添加到 LIST(检查工作表中是否有相同的字符)。如果每个人都已添加,我会转到下一个字符并从所有字符串中添加 1 个字符。依此类推,直到我在字符串中找到重复字符的位置。我把它写到结果[2]。现在我们知道在哪里寻找重复。

    1. 知道在字符串中查找重复的位置,我们将使用集合 SET。从每个字符串中,我们在最后一段中已找到的位置下添加一个字符。如果集合说这样的符号已经在集合中,我们找到了一个重复该符号的字符串。写入结果[1]

    3) 最简单的是第二行,它与在点 0 中找到的位置的第二个点中找到的字符串具有相同的索引。我们把它写在结果[0]中。返回结果

    public class Test {
        public static void main(String[] args) {
            String[] s = {"bdafg", "ceagi"};
    
            System.out.println("Final answer:"+ Arrays.toString(method(s)));
        }
    
        public static int[] method(String[] array){
            int n=array.length;
            int m=array[0].length();
            int [] result = new int[3]; // word1 word2 index
            for(int i=0;i< result.length;i++)
                result[i]=-1;
    
            //создаем двухмерный массив чаров на основе исходного массива:
    
            char [][] ch = new char[n][m];
    
    
            for(int i=0;i<n;i++)
                for (int j=0;j<m;j++)
                    ch[i][j]=array[i].charAt(j);
    
    
            //print(ch);
    
            //определяем индекс который повторяется и записываем его в result на [2] позицию.
            List<Character> list = new ArrayList<>();
            for(int j=0;j<m;j++) {
                for (int i = 0; i < n; i++)
                    if (!list.contains(ch[i][j])) list.add(ch[i][j]);
                if(list.size()<n){result[2]=j; break;}
                else list.clear();
            }
    
            if(result[2]==-1) {
                result=new int[0];
                return result;              // повторений не найдено, возвращаем пустой массив
            }
    
    
            //System.out.println(Arrays.toString(result));
    
            list.clear();
            //определяем слово которое повторяется и записываем его на [1] позицию
    
            for(int i=0;i< array.length;i++)
                list.add(array[i].charAt(result[2]));
            Set<Character> set = new HashSet<>();
    
    
            for(int i=0;i<list.size();i++)
                if(set.add(list.get(i)))set.add(list.get(i));
                else result[1]=i;
    
            //System.out.println(Arrays.toString(result));
    
    
            //и определяем [0] индекс в result (самое легкое):
            char repeatChar=array[result[1]].charAt(result[2]);
    
    
            for(int i=0;i<list.size();i++)
               if(list.get(i)==repeatChar){
                   result[0]=i;
                   return result;
               }
    
    
    
    return result;
        }
    
    
    
      /*  public static void print(char[][] ch){
            for(int i=0;i< ch.length;i++) {
                for (int j = 0; j < ch[i].length; j++)
                    System.out.print(ch[i][j] + " ");
                System.out.println();
            }
        }*/
    }
    

    结论:

    Final answer:[0, 1, 2]
    
    Process finished with exit code 0
    
    • 1
  2. MBo
    2022-07-20T22:11:09Z2022-07-20T22:11:09Z

    时间线性
    (正如 Stanislav Volodarskiy 建议的,一般来说,O(min(алфавит, N) * M)) 一个变体:

    创建一个包含 26 个哈希图的数组(使用 索引символ-"a",例如,对于字符“z”索引 25)

    (позиция:номер строки)我们遍历字符串,如果还没有键,则为每个字符添加一对到相应的字典中。如果这样的密钥已经存在,那么已经找到了解决方案。

    在 Python 中:

    def dupplaces(lst):
        maps = [{} for _ in range(26)]
        for i in range(len(lst)):  # номер строки
            for j in range(len(lst[i])):   # позиция в строке
                idx = ord(lst[i][j]) - ord('a')   #символ 'a'=0, 'b'=1...
                if j in maps[idx]:    # ключ уже есть,
                                      # для данного символа позиция j уже встречалась
                    return (maps[idx][j], i, j)
                else:
                    maps[idx][j] = i  
                      #символ idx зарегистрирован на j-м месте i-й строки
        return None
    
    S = ["abc", "bea", "dbe"]
    print(dupplaces(S))
    
    >>>(0, 2, 1)    #позиция 1 совпадает в строках 0 и 2
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5