1015. Letter-moving Game (35)

本文介绍了一种通过移动字符来转换字符串的方法。给定两个字符串p和t,目标是最少次数地将p变为t。文章提供了算法思路及实现代码,核心在于寻找最长匹配子序列以减少操作次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.题面

点击打开链接

2.题意

给出两个字符串p, 和 t, 只允许将p中的某个字符移动到字符串的末尾或是起始位置,问你至少经过几次移动可以将p变成t。

3.思路

不过不要求最小的移动次数,我们可以选择任意一个字符作为起点,随后按次序将所有在他右边的字符一个个挪到末尾,所有在左边的字符一个个挪到起始,最后整个字符串p就会自然而然地变成t.

这样的次数最多是length(p)-1次,为了减少次数,我们就需要尽可能地利用原有的次序关系。

方法是找到一个最大长度l使得t中有一个长度为l的子串tt, p中有个长度为l的子序列两者相等。

(子串和子序列的定义请自行了解)

4.代码

/*****************************************************************
    > File Name: cpp_acm.cpp
    > Author: Uncle_Sugar
    > Mail: uncle_sugar@qq.com
    > Created Time: Tue 21 Feb 2017 01:47:04 CST
*****************************************************************/
# include <cstdio>
# include <cstring>
# include <cctype>
# include <cmath>
# include <cstdlib>
# include <climits>
# include <iostream>
# include <iomanip>
# include <set>
# include <map>
# include <vector>
# include <stack>
# include <queue>
# include <algorithm>
using namespace std;

# define rep(i,a,b) for (i=a;i<=b;i++)
# define rrep(i,a,b) for (i=b;i>=a;i--)
# define mset(aim, val) memset(aim, val, sizeof(aim))

struct QuickIO{
    QuickIO(){const int SZ = 1<<20;
        setvbuf(stdin ,new char[SZ],_IOFBF,SZ);
        setvbuf(stdout,new char[SZ],_IOFBF,SZ);
    }                //*From programcaicai*//
}QIO;

template<class T>void PrintArray(T* first,T* last,char delim=' '){
    for (;first!=last;first++) cout << *first << (first+1==last?'\n':delim);
}

/*
1.see the size of the input data before you select your algorithm 
2.cin&cout is not recommended in ACM/ICPC
3.pay attention to the size you defined, for instance the size of edge is double the size of vertex
*/

const int debug = 1;
const int size  = 10 + 1000; 
const int INF = INT_MAX>>1;
typedef long long ll;

char p[size], t[size];
int main()
{
    // std::ios::sync_with_stdio(false);cin.tie(0);
    scanf("%s%s", p, t);
    int len = strlen(p);
    int ans = -1;
    for (int i = 0; i < len; i++){
        int tp = i, cnt = 0;
        for (int j = 0; j < len; j++){
            if (p[j] == t[tp]){
                tp++;cnt++;
            }
        }
        ans = max(cnt, ans);
    }
    printf("%d\n", len-ans);
    return 0;
}










### Morse Code Translation Morse code 是一种通过点(`.`)和划(`-`)来表示字母、数字和其他字符的编码方式。给定的例子 `.---- ..--- ...--` 表示一组莫尔斯电码序列,可以通过解析将其转换为对应的明文。 以下是 Python 实现的代码片段用于将莫尔斯电码转换为可读文本: ```python # 定义莫尔斯电码字典 morse_code_dict = { '.-': 'A', '-...': 'B', '-.-.': 'C', '-..': 'D', '.': 'E', '..-.': 'F', '--.': 'G', '....': 'H', '..': 'I', '.---': 'J', '-.-': 'K', '.-..': 'L', '--': 'M', '-.': 'N', '---': 'O', '.--.': 'P', '--.-': 'Q', '.-.': 'R', '...': 'S', '-': 'T', '..-': 'U', '...-': 'V', '.--': 'W', '-..-': 'X', '-.--': 'Y', '--..': 'Z', '-----': '0', '.----': '1', '..---': '2', '...--': '3', '....-': '4', '.....': '5', '-....': '6', '--...': '7', '---..': '8', '----.': '9' } def morse_to_text(morse_code): result = [] words = morse_code.split(' / ') # 使用斜杠分隔单词 for word in words: letters = word.split(' ') translated_word = ''.join([morse_code_dict.get(letter, '') for letter in letters]) result.append(translated_word) return ' '.join(result) input_morse = ".---- ..--- ...--" output_text = morse_to_text(input_morse) print(f"Translated text: {output_text}") ``` 上述代码会输出 `123`,因为 `.----` 对应于数字 `1`,`..---` 对应于数字 `2`,而 `...--` 则对应于数字 `3`[^1]。 ### 解析说明 在莫尔斯电码中,每个符号都映射到特定的字母或数字上。例如: - 数字 `1` 的莫尔斯电码是 `.----` - 数字 `2` 的莫尔斯电码是 `..---` - 数字 `3` 的莫尔斯电码是 `...--` 因此,`.---- ..--- ...--` 被成功解析并转化为阿拉伯数字形式 `123`。 #### 注意事项 程序假设输入的莫尔斯电码格式正确无误,并按照标准定义进行匹配。如果存在未知符号,则返回为空字符串[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值