2023-06-28:你想要用小写字母组成一个目标字符串 target。

开始的时候,序列由 target.length 个 '?' 记号组成

而你有一个小写字母印章 stamp。

在每个回合,你可以将印章放在序列上,并将序列中的每个字母替换为印章上的相应字母

你最多可以进行 10 * target.length 个回合

举个例子,如果初始序列为 "?????",而你的印章 stamp 是 "abc"

那么在第一回合,你可以得到 "abc??"、"?abc?"、"??abc"

(请注意,印章必须完全包含在序列的边界内才能盖下去。)

如果可以印出序列,那么返回一个数组,该数组由每个回合中被印下的最左边字母的索引组成

如果不能印出序列,就返回一个空数组。

例如,如果序列是 "ababc",印章是 "abc"

那么我们就可以返回与操作 "?????" -> "abc??" -> "ababc" 相对应的答案 [0, 2]

另外,如果可以印出序列,那么需要保证可以在 10 * target.length 个回合内完成

任何超过此数字的答案将不被接受。

输入:stamp = "abc", target = "ababc"。

输出:[0,2]。

答案2023-06-28:

大体步骤如下:

1.创建变量s和t,分别存储印章stamp和目标字符串target的字节数组表示。

2.创建变量m和n,分别存储印章长度和目标字符串长度。

3.创建数组inDegrees,长度为n-m+1,初始化每个元素为m。该数组表示每个位置需要匹配的印章字符数量。

4.创建二维数组graph,长度为n,每个位置是一个空的整数数组。该数组表示目标字符串每个位置对应的可能的匹配位置。

5.创建队列queue,长度为n-m+1,用于存储已经匹配完所有印章字符的位置。

6.创建变量l和r,分别表示队列queue的左右指针,初始时都为0。

7.遍历目标字符串,从0到n-m,依次处理每个位置:

7.1.在当前位置i,遍历印章的每个字符:

7.1.1.若目标字符串t的第i+j个字符与印章字符相等,表示匹配成功,更新inDegrees数组,将对应位置的值减1。

7.1.1.1.如果经过减1操作后,该位置上印章字符匹配数量变为0,将该位置加入队列queue,并将右指针r向右移动。

7.1.2. 若目标字符串t的第i+j个字符与印章字符不相等,表示匹配失败,将该位置加入graph[i+j]数组中,表示可以在该位置之后的某个位置尝试匹配印章。

8.创建bool类型的数组visited,长度为n,用于标记目标字符串的位置是否被访问过。

9.创建数组path,长度为n-m+1,用于记录完成印章替换的顺序。

10.创建变量size,初始为0,表示已经完成替换的印章的数量。

11.当左指针l小于右指针r时,执行以下循环:

11.1.取出队列queue中的当前位置cur,并将左指针l右移。

11.2.将当前位置cur加入数组path中,并增加size的值。

11.3.遍历印章的每个字符:

11.3.1.若当前位置cur+i未被访问过,表示可以尝试在该位置继续匹配印章:

11.3.1.1.将该位置标记为已访问visited[cur+i] = true。

11.3.1.2.遍历当前位置cur+i对应的graph数组中的每个位置next:

11.3.1.2.1.更新inDegrees数组,将对应位置的值减1。

11.3.1.2.1.1.如果经过减1操作后,该位置上印章字符匹配数量变为0,将该位置加入队列queue,并将右指针r向右移动。

12.检查完成替换的印章数量是否等于n-m+1,如果不相等,返回空数组[]。

13.将数组path中的元素按照首尾对称的顺序重新排列,即交换元素path[i]和path[j],其中i从0遍历到size-1,j从size-1遍历到0。

14.返回数组path作为结果。

该程序的总时间复杂度和总空间复杂度为:

总时间复杂度:O((n - m + 1) * m),其中n是target字符串的长度,m是stamp字符串的长度。

总空间复杂度:O(n),其中n是target字符串的长度。

go完整代码如下:

package main

import (
"fmt"
) func movesToStamp(stamp string, target string) []int {
s := []byte(stamp)
t := []byte(target)
m := len(s)
n := len(t)
inDegrees := make([]int, n-m+1)
for i := range inDegrees {
inDegrees[i] = m
}
graph := make([][]int, n)
for i := range graph {
graph[i] = []int{}
}
queue := make([]int, n-m+1)
l, r := 0, 0
for i := 0; i <= n-m; i++ {
for j := 0; j < m; j++ {
if t[i+j] == s[j] {
if inDegrees[i]--; inDegrees[i] == 0 {
queue[r] = i
r++
}
} else {
graph[i+j] = append(graph[i+j], i)
}
}
}
visited := make([]bool, n)
path := make([]int, n-m+1)
size := 0
for l < r {
cur := queue[l]
l++
path[size] = cur
size++
for i := 0; i < m; i++ {
if !visited[cur+i] {
visited[cur+i] = true
for _, next := range graph[cur+i] {
if inDegrees[next]--; inDegrees[next] == 0 {
queue[r] = next
r++
}
}
}
}
}
if size != n-m+1 {
return []int{}
}
for i, j := 0, size-1; i < j; i, j = i+1, j-1 {
path[i], path[j] = path[j], path[i]
}
return path
} func main() {
stamp := "abc"
target := "ababc"
result := movesToStamp(stamp, target)
fmt.Println(result)
}

rust完整代码如下:

fn moves_to_stamp(stamp: String, target: String) -> Vec<i32> {
let s: Vec<char> = stamp.chars().collect();
let t: Vec<char> = target.chars().collect();
let m = s.len();
let n = t.len();
let mut in_degrees: Vec<i32> = vec![m as i32; n - m + 1];
let mut graph: Vec<Vec<i32>> = vec![Vec::new(); n];
let mut queue: Vec<i32> = vec![0; n - m + 1];
let mut l = 0;
let mut r = 0; for i in 0..=n - m {
for j in 0..m {
if t[i + j] == s[j] {
if in_degrees[i] > 0 {
in_degrees[i] -= 1;
} if in_degrees[i] == 0 {
queue[r] = i as i32;
r += 1;
}
} else {
graph[i + j].push(i as i32);
}
}
} let mut visited: Vec<bool> = vec![false; n];
let mut path: Vec<i32> = vec![0; n - m + 1];
let mut size = 0; while l < r {
let cur = queue[l];
l += 1;
path[size] = cur;
size += 1; for i in 0..m {
let cur_i = cur + i as i32;
if !visited[cur_i as usize] {
visited[cur_i as usize] = true;
for &next in &graph[cur_i as usize] {
if in_degrees[next as usize] > 0 {
in_degrees[next as usize] -= 1;
} if in_degrees[next as usize] == 0 {
queue[r] = next;
r += 1;
}
}
}
}
} if size != n - m + 1 {
return Vec::new();
} for i in 0..size / 2 {
let tmp = path[i];
path[i] = path[size - 1 - i];
path[size - 1 - i] = tmp;
} path
} fn main() {
let stamp = String::from("abc");
let target = String::from("ababc");
let result = moves_to_stamp(stamp, target);
println!("{:?}", result);
}

c++完整代码如下:

#include <iostream>
#include <vector>
#include <algorithm> using namespace std; vector<int> movesToStamp(string stamp, string target) {
int m = stamp.length();
int n = target.length();
vector<int> inDegrees(n - m + 1, m);
vector<vector<int>> graph(n, vector<int>());
vector<int> queue(n - m + 1, 0);
int l = 0, r = 0; for (int i = 0; i <= n - m; i++) {
for (int j = 0; j < m; j++) {
if (target[i + j] == stamp[j]) {
if (--inDegrees[i] == 0) {
queue[r++] = i;
}
}
else {
graph[i + j].push_back(i);
}
}
} vector<bool> visited(n, false);
vector<int> path(n - m + 1, 0);
int size = 0; while (l < r) {
int cur = queue[l++];
path[size++] = cur; for (int i = 0; i < m; i++) {
if (!visited[cur + i]) {
visited[cur + i] = true; for (int next : graph[cur + i]) {
if (--inDegrees[next] == 0) {
queue[r++] = next;
}
}
}
}
} if (size != n - m + 1) {
return vector<int>();
} reverse(path.begin(), path.begin() + size);
return path;
} int main() {
string stamp = "abc";
string target = "ababc"; vector<int> result = movesToStamp(stamp, target); cout << "Result: ";
for (int num : result) {
cout << num << " ";
}
cout << endl; return 0;
}

2023-06-28:你想要用小写字母组成一个目标字符串 target。 开始的时候,序列由 target.length 个 ‘?‘ 记号组成 而你有一个小写字母印章 stamp。 在每个回合,你可的更多相关文章

  1. Insider Dev Tour(2018.06.28)

    时间:2018.06.28地点:北京金茂万丽酒店

  2. http://www.blogjava.net/zJun/archive/2006/06/28/55511.html

    http://www.blogjava.net/zJun/archive/2006/06/28/55511.html http://www.cnblogs.com/alipayhutu/archive ...

  3. 22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表。然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。

    22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法sh ...

  4. 2018.06.28 BZOJ1014 [JSOI2008]火星人prefix(非旋treap+hash)

    [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MB Submit: 8951 Solved: 2860 Description 火星 ...

  5. Murano Weekly Meeting 2016.06.28

    Meeting time: 2016.June.28 1:00~2:00 Chairperson:  Kirill Zaitsev, from Mirantis Meeting summary: 1. ...

  6. Effective C++ -----条款06:若不想使用编译器自动生成的函数,就该明确拒绝

    为驳回编译器自动提供的功能,可将相应的成员函数声明为private并且不予实现. 使用像Uncopyable这样的base class也是一种做法(即先声明一个基类,然后私有继承它).这其实有点像使用 ...

  7. http://www.cnblogs.com/Joyes1989/archive/2013/06/28/3161739.html centos 输入法安装切换

    昨天装了一个centos  安装输入法的时候  让我有点纠结  全英文的 读不懂

  8. 【资料下载区】【GMT43相关代码、资料下载地址】更新日期2017/06/28

    [GMT43相关文档][更新中...] GMT43原理图(PDF)下载GMT43说明书(PDF)下载GMT43机械结构尺寸(PDF)下载 [GMT43相关例程代码][ARM][更新中...] 基于HA ...

  9. DSP builder安装指南(以9.1为例) 转自http://www.cnblogs.com/sleepy/archive/2011/06/28/2092362.html

    DSP Builder在算法友好的开发环境中帮助设计人员生成DSP设计硬件表征,从而缩短了DSP设计周期.已有的MATLAB函数和Simulink模块可以和Altera DSP Builder模块以及 ...

  10. 2019.06.28 MERGE INTO备忘

    --保存主表 MERGE INTO dbo.DeliveryReceiving AS t USING @ReceiveMainDt AS s ON t.Id=s.id WHEN MATCHED THE ...

随机推荐

  1. 异步注解@Async使用及其部分调优

    对于spring异步注解@Async的使用: 对于异步方法调用,从Spring3开始提供了@Async注解,该注解可以被标注在方法上,以便异步地调用该方法.调用者将在调用时立即返回,方法的实际执行将提 ...

  2. 无法加载 DLL“xxxx.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。

    有一台服务器在执行接口的时候遇到了这样一个问题: 其他服务器上都没有这个问题,IIS部署好的项目目录的bin文件夹下是有这个dll的,但却提示无法加载,在网上找了好多帖子,终于发现了问题. 首先用De ...

  3. 【D01】Django中实现带进度条的倒计时功能(简易版)

    首先说明简易版是只有一个 倒计时 和一个 进度条,页面加载后自动开始计时,下次计时需要手动刷新页面. 后续会更新实现完整的倒计时功能的文章 前期准备 前端框架 你需要准备一些前端框架:Bootstra ...

  4. Pillow + pytesseract + tesseract-ocr 破解简单的图形验证码

    前言: 我们在做WEB UI自动化测试时,会遇到一些图形验证码,今天就来简单介绍下,如何来识别简单的图形验证码. 一.安装 ◇ Pillow pip3 install Pillow ◇ pytesse ...

  5. Prism Sample 22-ConfirmCancelNavigation

    导航到一个视图,如果在离开这个视图时需要确认,在VM中实现以下接口 public class ViewAViewModel : BindableBase, IConfirmNavigationRequ ...

  6. 工作中,Oracle常用函数

    目录 1.序言 2.Oracle函数分类 3.数值型函数 3.1 求绝对值函数 3.2 求余函数 3.3 判断数值正负函数 3.4 三角函数 3.5 返回以指定数值为准整数的函数 3.6 指数.对数函 ...

  7. 【ATL】注册插件成功后自动设置浏览器允许弹出窗口注册表

    STDAPI DllInstall(BOOL bInstall, LPCWSTR pszCmdLine) { HRESULT hr = E_FAIL; static const wchar_t szU ...

  8. 代码打包的可视化数据分析图: webpack-bundle-analyzer 的使用

    先看webpack-bundle-analyzer的效果图(官方效果图): 通过使用webpack-bundle-analyzer可以看到项目各模块的大小,可以按需优化 1.先安装 npm insta ...

  9. 2023-04-02:设计一个仓库管理器,提供如下的方法: 1) void supply(String item, int num, int price) 名字叫item的商品,个数num,价格pri

    2023-04-02:设计一个仓库管理器,提供如下的方法: void supply(String item, int num, int price) 名字叫item的商品,个数num,价格price. ...

  10. 2022-07-10:以下go语言代码输出什么?A:A,B;B:A,C:A,fatal error;D:fatal error... func main() { var m sync.Mute

    2022-07-10:以下go语言代码输出什么?A:A,B:B:A,C:A,fatal error:D:fatal error- func main() { var m sync.Mutex fmt. ...