首页 > 其他分享 >字符串转换

字符串转换

时间:2023-09-11 20:00:26浏览次数:25  
标签:转换 cur int pattern vector res 字符串

给你两个长度都为 n 的字符串 s 和 t 。你可以对字符串 s 执行以下操作:

将 s 长度为 l (0 < l < n)的 后缀字符串 删除,并将它添加在 s 的开头。
比方说,s = 'abcd' ,那么一次操作中,你可以删除后缀 'cd' ,并将它添加到 s 的开头,得到 s = 'cdab' 。
给你一个整数 k ,请你返回 恰好 k 次操作将 s 变为 t 的方案数。

1. 动态规划 + 矩阵快速幂 + KMP算法

由于结果很大,考虑动态规划的状态转移
状态的转移需要知道字符串循环节的个数,使用KMP求s的循环节个数,这里拆环为链
最后由于迭代次数过多,这里需要使用矩阵快速幂

class Solution {
public:
    const int MOD = 1e9 + 7;
    int numberOfWays(string s, string t, long long k) {
        int n = s.size();//长度决定可以移动的距离和操作数
        //dp1[i]表示i次操作后等于t的方案数,dp1[i] = dp1[i-1]*(c-1) + dp2[i-1]*c
        //dp2[i]表示i次操作后不等于t的方案数dp2[i] = dp1[i-1]*(n-c) + dp2[i-1]*(n-1-c)
        //下面我们要求s中有多少个循环节c,然后运算迭代k次
        int c = search(s+s.substr(0,n-1),t);//寻找对应字符串中t出现的次数
        if(c==0) return 0;//无法通过操作得到
        vector<vector<int>> matrix = {
            {c-1,c},
            {n-c,n-1-c}
        };
        matrix = fastpower(matrix,k);
        return matrix[0][s!=t];
    }
    int search(string text,string pattern){
        //KMP算法
        int n = pattern.size();
        vector<int> fail(n, -1);//记录的是上一个相同位置
        for (int i = 1; i < n; ++i) {
            int j = fail[i - 1];
            while (j != -1 && pattern[j + 1] != pattern[i]) 
                j = fail[j];
            if (pattern[j + 1] == pattern[i]) 
                fail[i] = j + 1;
        }
        //计算出现多少次
        
        int cnt = 0; int idx = -1;//模板串下标
        
        for(int i=0;i<text.size();i++){//遍历主串
            while(idx!=-1&&pattern[idx+1]!=text[i])
                idx = fail[idx]; //重置模板串下标
            if(pattern[idx+1]==text[i]) idx++;
            if(idx==pattern.size()-1){
                cnt++;
                idx = fail[idx];
            }
        }
        return cnt;
    }

    vector<vector<int>> mutiply(vector<vector<int>>& left,vector<vector<int>> &right){
        int m = left.size(); int n = right.size();
        vector<vector<int>> res(m,vector<int>(m));
        for(int i=0;i<m;i++)  //遍历left 的 m行
            for(int j=0;j<m;j++) //遍历right 的 m列
                for(int k=0;k<n;k++) //遍历相乘的每一个数
                    res[i][j] = (res[i][j] + ((long long)left[i][k]*right[k][j])%MOD)%MOD;
        return res;
    }
    vector<vector<int>> identify(int m){
        vector<vector<int>> res(m,vector<int>(m));
        for(int i=0;i<m;i++)
            res[i][i] = 1;
        return res;
    }

    vector<vector<int>> fastpower(vector<vector<int>> cur, long long n){
        int m = cur.size();
        vector<vector<int>> res = identify(m);//初始化单位矩阵
        while(n){//进行快速幂运算
            if(n&1) res = mutiply(res,cur);
            cur = mutiply(cur,cur);//倍增
            n>>=1;
        }
        return res;
    }
};

标签:转换,cur,int,pattern,vector,res,字符串
From: https://www.cnblogs.com/929code/p/17694344.html

相关文章

  • 查找字符串最长公共子串,请编码实现一个命令行工具,找出指定的2个字符串的最长公共子串
    要求给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1。输入描述命令行工具接收两个字符串参数。输入字符串的合法字符集为[a-zA-Z0-9],大小写敏感,无需考虑异常输入场景。输出描述输出一行最长公共子串示例输入1ABCD2345G12345EF输出2345解法一:滑......
  • 如何实现数据流畅转换?火山引擎ByteHouse推出ELT能力
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群在数据分析场景中,企业使用的数据通常具备来源多样化的特点,如支付交易记录、用户行为等,且数据格式各异,有的为行式存储结构,有的为列式存储结构。这就要求企业数仓具备一定的数据转换能力。传统方式......
  • GLTF文件格式解析与格式转换
    GLTF格式简介GLTF是一种免版税的规范,用于引擎和应用程序高效传输和加载3D场景和模型,最小化了3D资产的大小,以及解包和使用它们所需的运行时处理,定义了一种可扩展的发布格式,通过在整个行业中实现3D内容的互操作使用,简化了创作工作流程和交互服务。GLTF2.0已作为ISO/IEC12113:2022国......
  • STEP文件格式解析与格式转换
    STEP格式简介STEP格式是一种STP三维文件,是基于ASCII格式符合STEP应用协议ISO10303-21标准的正文编码的交换结构的三维图像数据。STP文件使用CATIA(计算机辅助三维交互应用)软件打开,通常在不同平台下有很多这类软件可以打开STP格式文件,Windows系统下就有大家熟知的UG、PRO-E、FreeCAD......
  • FBX模型解析与格式转换
    FBX格式简介FBX格式是一种3D通用模型文件格式。FBX格式是Autodesk公司收购Kaydara以后,研发的一种3D通用模型文件。包含动画、材质特性、贴图、骨骼动画、灯光、摄像机等信息。FBX格式用于在诸如3dsMax、Maya、Softimage等软件间进行模型、材质、动作和摄影机信息的互导。FBX最大的......
  • IGES文件格式解析与格式转换
    IGES文件格式简介IGS是根据IGES标准生成的文件,主要用于不同三维软件系统的文件转换。IGES标准,是建立在波音公司CAD/CAM集成信息网络、通用电气公司的中心数据库和其他各种数据交换格式之上的。其最初版本仅限于描述工程图纸的几何图形和注释,随后又将电气、有限元、工厂设计和建筑设......
  • 字节序转换接口
    第一组#include<arpa/inet.h> //函数作用:将无符号整数hostlong从主机字节顺序转换为网络字节顺序。 uint32_thtonl(uint32_thostlong); //函数作用:将无符号短整数hostshort从主机字节顺序转换为网络字节顺序。 uint16_thtons(uint16_thostshort); //函数作用::将无符......
  • Golang 初识: 函数调用与定义丶字符串处理丶Json的处理
    一.基本函数调用与定义1packagemain23import(4"encoding/json"5"errors"6"fmt"7"math/rand"8"mylib/pkg/student"9"mylib/pkg/utils"10"sort"11......
  • 字符串减法
    字符串减法1.题目地址https://www.acwing.com/problem/content/1536/2.题目解析具体题意,看上图即可。这里不再赘述。值得注意的是:这道题对于时间复杂度的要求很高,需要考虑优化问题。3.题解4.代码......
  • Java基础学习——字符串
    目录1String概述 2String构造方法代码实现和内存分析2.1创建方式2.2内存区1.StringTable(串池)2.直接赋值创建字符串方式内存图3.通过new创建字符串方式内存图 3字符串比较3.1“==”号比较的内容    1String概述总结:1.String是Java定义好......