问题:

如果 search 在 dist 中顺序出现而不要求连续出现,那代码应该如何修改?如何计算这种匹配的可能性?

数组 search=[5,4,6],在数据 dist=[1,5,5,4,3,4,5,6]的起始位置是1

(因为dist下标{1,3,7}和下标{1,5,7}的元素都等于 search=[5,4,6],故有两种可能)

        /// <summary>
/// 如果 search 在 dist 中顺序出现而不要求连续出现,那代码应该如何修改?如何计算这种匹配的可能性?
/// 例如:
/// 数组 search=[5,4,6],在数据 dist=[1,5,5,4,3,4,5,6]的起始位置是1
/// (因为dist下标{1,3,7}和下标{1,5,7}的元素都等于 search=[5,4,6],故有两种可能)
/// </summary>
private static void indexOf()
{
var search = new int[] { , , };
Console.WriteLine($"连续出现的数组:{string.Join("-", search)}");
var dist = new int[] { , , , , , , , };
Console.WriteLine($"需要比对的数组:{string.Join("-", dist)}");
var dictionary = new Dictionary<object, List<int>>();
// 按照数组顺序初始化字典
foreach (var item in search)
{
dictionary.Add(item, new List<int>());
}
// 把search中元素的下标记录下来
for (int i = ; i < dist.Length; i++)
{
var key = dist[i];
if (Array.IndexOf(search, key) > -)
{
if (dictionary.ContainsKey(key))
{
dictionary[key].Add(i);
}
}
}
var group = new List<List<int>>();
Console.WriteLine("分组前:");
foreach (var key in dictionary.Keys)
{
Console.WriteLine($"Key:{key}\t下标集合:{string.Join("-", dictionary[key])}");
}
Add(new List<int>(), -, , search, dictionary, group);
Console.WriteLine("分组后:");
foreach (var item in group)
{
Console.WriteLine($"下标集合:{string.Join("-", item)}");
}
} /// <summary>
/// 递归添加
/// </summary>
/// <param name="list">需要添加的集合</param>
/// <param name="parentKey">上一次的key,当前循环key要比上一次大</param>
/// <param name="index">下标</param>
/// <param name="search"></param>
/// <param name="dictionary"></param>
/// <returns></returns>
private static void Add(List<int> list, int parentKey, int index, int[] search, Dictionary<object, List<int>> dictionary, List<List<int>> group)
{
if (search.Count() <= index)
{
// 匹配项超过数组长度,终止
group.Add(list);
return;
} // 当前下标的值
var key = search[index];
if (dictionary.ContainsKey(key))
{
var itemList = dictionary[key];
// 循环值
for (int j = ; j < itemList.Count(); j++)
{
var itemKey = itemList[j];
// 当前循环key要比上一次大
if (itemKey < parentKey)
{
return;
}
var clone = Clone(list);
clone.Add(itemKey);
Add(clone, itemKey, index + , search, dictionary, group);
}
}
} /// <summary>
/// 克隆
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
private static List<int> Clone(List<int> list)
{
var clone = new List<int>();
foreach (var item in list)
{
clone.Add(item);
}
return clone;
}

NET 在一个数组中查找另一个数组所在起始位置(下标从0开始,未找到返回-1)的更多相关文章

  1. js 从目标数组中过滤掉 一个数组元素,

    标题描述的有点僵硬,大概需求是,从目标数组中过滤掉我想要删除的元素集合,这里使用的是遍历+过滤器的组合,很方便,做个笔记! let old = ["AE_CN_SUPER_ECONOMY_G ...

  2. sqlserver中获取最后一个字符所在的位置

    CHARINDEX('字符',reverse(字段名称)) 这个意思就是将字段进行反转,就是从后往前取,这样就能够获取一个字符最后所在的位置

  3. [LeetCode] 34. Find First and Last Position of Element in Sorted Array 在有序数组中查找元素的第一个和最后一个位置

    Given an array of integers nums sorted in ascending order, find the starting and ending position of ...

  4. 《剑指Offer》第1题(Java实现):在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    一.题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该 ...

  5. 42.输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的。

    输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的. 这道题有很多烟雾弹: 首先如果有多对,最前面的两个数就是乘积最小的, ...

  6. Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置

    在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...

  7. 【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置

    34. 在排序数组中查找元素的第一个和最后一个位置 知识点:数组,二分查找: 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置 ...

  8. 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...

  9. Leetcode算法【34在排序数组中查找元素】

    在之前ARTS打卡中,我每次都把算法.英文文档.技巧都写在一个文章里,这样对我的帮助是挺大的,但是可能给读者来说,一下子有这么多的输入,还是需要长时间的消化. 那我现在改变下方式,将每一个模块细分化, ...

随机推荐

  1. Python 爬虫之 Beautifulsoup4,爬网站图片

    安装: pip3 install beautifulsoup4 pip install beautifulsoup4 Beautifulsoup4 解析器使用 lxml,原因为,解析速度快,容错能力强 ...

  2. SQLAlchemy 应用创建

    1.首先创建app文件夹 同django 创建app 一样 创建文件 在创建的views中写入两个蓝图函数为了操作数据库的增删改查 acc.py from flask import Blueprint ...

  3. javascript加载XML字符串或文件

    1. 加载XML文件 方法1:ajax方式.代码如下: var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObje ...

  4. Python 函数小程序初解

    目录 作业 ==程序代码自上往下运行,建议自上而下的完成下列任务== 作业 文件a.txt内容:每一行内容分别为商品名字,价钱,个数,求出本次购物花费的总钱数 sum = 0 f = open('a. ...

  5. 唐敬博-201871010118 《面向对象程序设计(java)》第六、七周学习总结

    在博客园撰写博客(随笔),总结6-7周学习内容(包括实验内容),作业格式要求如下: 博文名称:学号-姓名<面向对象程序设计(java)>第四周学习总结(1分) 博文正文开头格式:(2分) ...

  6. 【Spring AOP】通知(五)

    一.通知介绍 1. 前置通知(Before) 在目标方法执行之前执行的通知. 前置通知方法,可以没有参数,也可以额外接收一个JoinPoint,Spring会自动将该对象传入,代表当前的连接点,通过该 ...

  7. centos7 扩容

    用 df -h, 看到磁盘满了 (注意:如果是二,或者第三次扩容,下面的参数就不一样) fdisk /dev/sda 但是失败了,显示没有多余的分区 可以看到 有个/dev/sda4 是我在这之前刚刚 ...

  8. 【Excel】输入单引号

    首位输入:输入两个单引号 拼接输入:可以引入输入 举个例子:拼接一个SQL,values都是字符串,需要引号 =IF( OR(A2="",B2="",C2=&q ...

  9. elasticsearch入门及安装

    参考教程 elasticsearch入门教程:https://www.yiibai.com/elasticsearch/elasticsearch-getting-start.html Java JD ...

  10. flask回顾

    pip install flask from flask import Flask app = Flask(__name__) # 命令行启动,用manager,访问会变的非常慢 pip instal ...