首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >字符串的连接并检查是否可以形成给定的字符串

字符串的连接并检查是否可以形成给定的字符串
EN

Stack Overflow用户
提问于 2021-03-25 07:15:23
回答 1查看 574关注 0票数 0

给定一个较大的字符串,一个正整数m和m个较小的字符串,检查是否可以将m个较小的字符串连接起来,以任何顺序使用每个字符串0次或多次。

我知道如何在C++中连接字符串。但我发现很难找到解决这个问题的算法。也许重载操作符,子序列检查等将需要,我可以形成代码。但我找不到算法。请帮帮我!

EN

回答 1

Stack Overflow用户

发布于 2021-03-25 10:22:15

也许是这样的。我们不断删除候选子字符串的所有匹配项,直到最终结果为空或不为空。如果它是空的,那么成功,否则就不可能。

Bambo-Otrit指出了下面代码中的一个缺陷,因此不太符合规范。让我们看看我们能做些什么,请随意跳到任何人身上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <vector>
#include <string>
#include <iostream>


using string = std::string;
using size_type= std::string::size_type;
using svector = std::vector<string>;

void eraseAllOccurences(const string& s, string& result){   

    string::size_type pos = string::npos;

    while ( (pos  = result.find(s) ) !=  string::npos){
        result.erase(pos, s.length());
    }    
}



int main(int, char**){

    const string targetString = "bcaaac";   
    const svector candidates = { "a", "b", "c" };

    string result = targetString;

    for(auto s : candidates)
        eraseAllOccurences(s, result);  

    std::cout << (result.empty() ? "success" : "failure") << '\n';

    return 0;
}

==============================================================

好的。试试看这个怎么样。代码需要整理一下,并进行一大堆测试,但这会让你对我想要做的事情有一个概念。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <string_view>

using std::cout;
using std::string;
using size_type = std::string::size_type;
using svector = std::vector<string>;        //string vector
using ivector = std::vector<std::size_t>;   //index vector
using sview = std::string_view;
using sviews = std::vector<sview>;

inline bool isSubStringOf(sview str, sview substr){
    return str.find(substr) != string::npos;
}

inline bool startsWith(sview str, sview prefix) {
    return str.size() >= prefix.size() && str.compare(0,  prefix.size(), prefix) == 0;
}

// just to hold the alphabet not really, could just use a vector. Was more for debug.
class Alphabet{
public:
    Alphabet() = default;
    Alphabet(const Alphabet&) = default;
    Alphabet(Alphabet&&) = default;
    Alphabet& operator=(const Alphabet&) = default;
    Alphabet& operator=(Alphabet&&) = default;
    Alphabet(const svector& sv) : m_letters(sv){}
    ~Alphabet() = default;

    ivector prefixLengths(sview str) const;
    const svector& letters() const { return m_letters; }
    void prepare(const string&);

private:
    svector m_letters;
};


// prepare alphabet by removing junk
void Alphabet::prepare(const string& str)
{

    //remove duplicate strings
    std::sort(m_letters.begin(), m_letters.end());
    m_letters.erase( std::unique( m_letters.begin(), m_letters.end() ), m_letters.end() );

    for(auto it = m_letters.begin() ; it != m_letters.end(); ) {
        if (it->empty())                    //remove empty strings
            it = m_letters.erase(it);
        else if(!isSubStringOf(str, *it))   //remove letters that don't appear in str
            it = m_letters.erase(it);
        else
            ++it;
    }
}


// return vector of the unique lengths of all letters that start the word str
ivector Alphabet::prefixLengths(sview str) const
{
    ivector result;
    for(auto prefix : m_letters)
        if(startsWith(str, prefix))
            result.push_back(prefix.size());

    return result;
}


// create a vector of string views by removing prefixes from given views
sviews nextViews(const sviews& views, const Alphabet& strings)
{
    sviews result;
    for(auto v : views){
        auto lengths = strings.prefixLengths(v);
        for(auto e : lengths){
            sview sv(v);
            sv.remove_prefix(e);
            result.push_back(sv);
        }
    }
    // ["a", "bc"] and ["ab", "c"] will both yield a prefix length of 3
    // so we will get the same view of the word so remove duplicates views
    std::sort(result.begin(), result.end());
    result.erase( std::unique( result.begin(), result.end() ), result.end() );

    return result;
}



int main(int, char**)
{
    const string word = "abcdabcdabcdbccbcabchk";
    const svector letters = { "ab", "abc", "c", "bc", "cd", "hk" };


    // tidy up the alphabet to only include letters that appear in the word
    // and remove empty letters and duplicates
    Alphabet alphabet(letters);
    alphabet.prepare(word);

    // we start with a view of the original word
    sviews views = { word };

    // keep stripping off prefixes from the views until we get an empty view
    // or we have no more to try
    while(!views.empty()){
        bool success = std::find_if(
            views.begin(),
            views.end(),
            [](auto e){ return e.empty(); })  != views.end();

        if(success){
            cout << "success\n";
            return 0;
        }
        views = nextViews(views, alphabet);
    }

    cout << "fail\n"; // we ran out of views to find prefixes for
    return 0;
}

================================================================

更新:在没有垃圾的情况下减少了版本

我们可以扔掉我用于调试的所有垃圾,只需要将索引集记录到word中即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <string_view>
#include <set>

using std::cout;
using std::string;
using svector = std::vector<string>;        // string vector
using ivector = std::vector<std::size_t>;   // index vector
using sview = std::string_view;             // string_view
using iset = std::set<std::size_t>;         // index set



inline bool isSubStringOf(sview str, sview substr){
    return str.find(substr) != string::npos;
}


inline bool startsWith(sview str, sview prefix) {
    return str.size() >= prefix.size() && str.compare(0, prefix.size(), prefix) == 0;
}


// prepare alphabet by removing junk
svector prepare(const svector& letters, const string& word)
{
    svector result = letters;

    //remove duplicate strings
    std::sort(result.begin(), result.end());
    result.erase( std::unique( result.begin(), result.end() ),   result.end() );

    for(auto it = result.begin() ; it != result.end(); ) {
        if (it->empty())                    //remove empty strings
            it = result.erase(it);
        else if(!isSubStringOf(word, *it))  //remove strings that don't appear in word
            it = result.erase(it);
        else
            ++it;
    }
    return result;
}


// vector of lengths of letters that prefix str
ivector prefixLengths(sview str, const svector& letters)
{
    ivector result;
    for(auto& prefix : letters)
        if(startsWith(str, prefix))
            result.push_back(prefix.size());

    return result;
}


// return view of string advanced by i chars
sview advanceViewOf(std::size_t i, const string& str)
{
    sview view(str);
    view.remove_prefix(i);
    return view;
}


// return set of indices into word for all prefixes
iset nextIndexSet(const iset& indices, const string& word, const svector& letters)
{
    iset result;
    for(std::size_t i : indices){
        for(std::size_t length : prefixLengths(advanceViewOf(i, word), letters))
            result.insert(i + length);
    }
    return result;
}


const string word = "abcdabcdabcdbccbcabchk";
const std::size_t wordLength = word.size();
const svector letters = { "a", "ab", "abc", "c", "bc", "cd", "hk" };


int main(int, char**)
{
    svector alphabet = prepare(letters, word);
    iset indices = {0};

    do{
        bool success = indices.find(wordLength) != indices.end();
        if(success){
            cout << "success\n";
            return 0;
        }
        indices = nextIndexSet(indices, word, letters);
    }while(!indices.empty());

    cout << "fail\n";

    return 0;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66794760

复制
相关文章
MFC控件编程之组合框跟列表框
  如果要使用组合框跟列表框.那么就要知道.组合框列表框是最核心的东西就是索引. 索引是从0开始的.
IBinary
2019/05/25
1.1K0
基因集合的数据框,列表和对象形式
这些都离不开生物学功能数据库,但是数据库不仅仅是GO/KEGG哦,目前最齐全的应该是属于 MSigDB(Molecular Signatures Database)数据库中定义了已知的基因集合:http://software.broadinstitute.org/gsea/msigdb 包括H和C1-C7八个系列(Collection),每个系列分别是:
生信技能树
2022/12/16
1.6K0
基因集合的数据框,列表和对象形式
oracle物化视图的刷新命令_物化视图增量刷新
普通视图仅包含其定义和被引用表的元数据,并不实际存储数据,查询数据时需要通过视图再去主表中获取数据。但是当需要查询的数据字段过多时,普通视图的效率会急剧下降。物化视图将经常使用的数据拷贝并存储下来,在查询时就可以直接返回数据。本质上是一个物理表,会占用磁盘空间。
全栈程序员站长
2022/11/15
2.6K0
【译】在列表视图中处理空值
本篇文章主要针对两类开发者。第一个是曾遇到过IllegalArgumentException: Path must not be empty问题的开发者。第二个则是当ListView使用了未被完整加载的图像,应用程序仍能正确运转的开发者们。
小鄧子
2018/08/20
1.2K0
列表内数字组合最大值
第一种 import itertools lt = [4, 40, 45, 6, 9, 3, 5, 2, 8] lt2 = map(str, lt) it = itertools.permutations(lt2,len(lt)) # for i in it: # print(i) m = map(lambda x:''.join(x), it) # for i in m: # print(i) print(max(m)) # print(m, type(m)) 第二种 lt = [4,
py3study
2020/01/17
8520
列表视图(ListView和ListActivity)
在ListView中显示网络图片  ImageView 类虽然有一个 setImageUri 方法,但不能直接接受一个由网络地址生成的uri作为参数从而显示图片,我们只好使用其 setImageBit
欢醉
2018/01/22
1.6K0
列表视图(ListView和ListActivity)
模板代码 - 列表和下拉刷新
摘要总结:本篇文章主要介绍了如何使用ViewStub和ViewStubCompat实现多布局,以便在不同的屏幕尺寸和分辨率下达到较好的展示效果。同时,还介绍了如何使用ViewStub和ViewStubCompat实现内边距和圆角,以及自定义属性在布局中的使用。
用户1172465
2018/01/05
2.9K0
html下拉框设置默认值_html下拉列表框默认值[通俗易懂]
HTML 和 JavaScript 综合练习题一、单项选择 1. Web 使用( D )在服务器和客户端之间传输数据。 A.FTP B. Telnet C. E-mail D. HTTP 2. HTTP 服务默认……
全栈程序员站长
2022/11/15
33.9K1
Vue改变数组值,页面视图为何不刷新?
这个问题还折腾了快半个小时,归根到底还是不经常使用的后果,好多代码之前都用过,像封装组件这种还要折腾,简直是不知道说什么好呀,只能以后多使用了。
执行上下文
2022/07/26
1.7K0
Vue改变数组值,页面视图为何不刷新?
数据框、矩阵和列表20230202
2、read.csv(" ") ⚠️文件在当前的工作路径中可以直接使用文件名,否则需要使用绝对路径,否则就会报错。
顾卿岚
2023/02/03
1.4K0
UI自动化 --- UI Automation 基础详解
上一篇文章UI自动化 --- 微软UI Automation中,介绍了UI Automation能够做什么,且借助 Inspect.exe 工具完成了一个模拟点击操作的Demo,文章结尾也提出了自己的一些想法,想要借助UI Automation做一个UI自动化测试平台。想法毕竟是想法,还是得落地实践,一步一步来。
Niuery Diary
2023/10/22
3.7K0
UI自动化 --- UI Automation 基础详解
【Python】基于多列组合删除数据框中的重复值
最近公司在做关联图谱的项目,想挖掘团伙犯罪。在准备关系数据时需要根据两列组合删除数据框中的重复值,两列中元素的顺序可能是相反的。
阿黎逸阳
2020/09/08
14.8K0
在jquery中用下拉框列表显示默认的值
1、在postUpdate.jsp中添加js如下: <script type="text/javascript"> $(document).ready(function(){ var qx_value = $('#qx_select_value').val(); $("#qx_select option[value='"+qx_value+"']").attr("selected", "selected"); }) </script> 核心代码就这一句话: $("
qubianzhong
2018/08/10
3.6K0
对象的组合
同步策略 规定了如何将不变性条件、线程封闭和加锁机制结合起来以维护线程的安全性,并且规定了哪些变量由哪些锁来保护
JavaEdge
2022/11/29
4090
flutter的列表下拉刷新
flutter的列表下拉刷新需要借助一个组件来实现,这个组件的名字是RefreshIndicator,直译过来就是刷新指示灯。
挥刀北上
2021/01/07
4.8K0
flutter的列表下拉刷新
Flat风格的Qml组合框
基于Qml的ComboBox控件修改而成。 组合框代码 import QtQuick 2.0 import QtQuick.Controls 2.0 import QtGraphicalEffect
Qt君
2019/12/16
1.2K0
突破数据验证列表,使用VBA创建3层和4层级联组合框
你是否曾想过管理级联数据验证(即“数据有效性”)列表,而不需要几十到数百个命名的单元格区域?这里为你提供一个示例工作簿,其中运用的方法可以动态创建数据验证列表,允许管理垂直列表,向列表中添加新列,并无缝更新数据验证列表。
fanjy
2022/11/16
1.4K0
突破数据验证列表,使用VBA创建3层和4层级联组合框
Django学习-第十二讲:视图高级(二)类视图、模板视图、列表视图、和分页
在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图。使用类视图可以使用类的一些特性,比如继承等。
小海怪的互联网
2019/10/08
1K0
SMART让您的内容和SEO更智能
你多学一样本事,就少说一句求人的话!只有自己足够强大,才不会被别人践踏。 SMART目标管理原则,如何用SMART原则来与SEO相关联?如何让SMART原则应用到网站内容中去?今天主要来聊聊SMART
黄伟SEO
2018/05/17
8440
js页面刷新或关闭时弹框消失_js刷新页面如何保留页面内容
  用法:onbeforeunload 事件在即将离开当前页面(刷新或关闭)时触发。该事件可用于弹出对话框,提示用户是继续浏览页面还是离开当前页面。对话框默认的提示信息根据不同的浏览器有所不同,标准的信息类似 “确定要离开此页吗?”。该信息不能删除。但你可以自定义一些消息提示与标准信息一起显示在对话框。注意: 在 Firefox 浏览器中,只显示默认提醒信息(不显示自定义信息)。
全栈程序员站长
2022/11/17
11.9K0

相似问题

组合框的列表视图值

11

当组合框#1更改值时刷新页面和组合框#2的内容

23

绑定对象更改时刷新视图

11

是否在字段值更改时刷新查询驱动的组合框值?

30

列表视图组合框

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文