code vs1099 字串变化 字符串搜索(STL)

题目链接:

http://codevs.cn/problem/1099/

题解思路:

1.用string 类型来保存字符串 方便插入比较等操作

2.用STL set<string>来判断当前字符串是否出现过

注意字符串的下标

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<set>
using namespace std;
struct node
{
    string str;
    int step;
} head;
struct node2
{
    string a,b;
};
vector<node2>edge;             //存边
set<string>M;
void bfs(string start,string endd)
{
    queue<node>q;
    M.insert(start);
    q.push( {start,0});
    while(!q.empty())
    {
        head=q.front();
        q.pop();
        if(head.str==endd)
        {
            cout<<head.step<<endl;
            return;
        }
        int len=head.str.length();
        for(int i=0; i<edge.size(); i++)
        {
            for(int j=0; j<(int)len-(int)edge[i].a.length()+1; j++)    //如果a的length()比 b的length()要小  则a.length()-b.length()结果会出错
                if(edge[i].a==head.str.substr(j,edge[i].a.size()))
                {
                    string d;
                    d.append(head.str,0,j);
                    d.append(edge[i].b);
                    d.append(head.str,j+edge[i].a.size(),string::npos);       //从j+edge[i].a.size()到末尾 全部push_back
                    if(M.find(d)==M.end()){          //用set判重
                        M.insert(d);
                        q.push({d,head.step+1});
                    }
                }
        }
    }
    cout<<"NO ANSWER!"<<endl;
    return;
}
int main()
{

    string start,endd,a,b;
    cin>>start>>endd;
    while(cin>>a>>b)
        edge.push_back( {a,b});
    bfs(start,endd);
    return 0;
}
时间: 2024-10-16 18:52:28

code vs1099 字串变化 字符串搜索(STL)的相关文章

【Foreign】字串变化 [DP]

字串变化 Time Limit: 10 Sec  Memory Limit: 128 MB Description 定义一个(大写字母)字符串集合{S},初始时值包含一个给定的字符串S1,每次从中任意取出一个字符串,将它变换后再放入集合中.要求新的字符串在集合中没有出现过. 变换的规则:在变化前.后,字符串均有大写字母组成,每次只改动一个位置,使它的ASCLL加1.例如:‘A’ –> ‘B’.如果位置为‘Z’,则无法改动.若干次操作后,该集合的元素个数一定会达到最大. 对最后的集合(已按字典序排

java之字符串中查找字串的常见方法

1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引.      int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引. 函数数名:indexOf 调用方式:Object(String).indexOf(String str,int startIndex)或String.indexOf(String str) 参数说明:str需要查找的字串. startI

字串符相关 split() 字串符分隔 substring() 提取字符串 substr()提取指定数目的字符

split() 方法将字符串分割为字符串数组,并返回此数组. stringObject.split(separator,limit) 我们将按照不同的方式来分割字符串: 使用指定符号分割字符串,代码如下: var mystr = "www.imooc.com"; document.write(mystr.split(".")+"<br>"); document.write(mystr.split(".", 2)+&

求字符串2是是否是字符串1的字串

template<typename T> T my_search(T first1, T last1, T first2, T last2) { int d1 = distance(first1, last1); int d2 = distance(first2, last2); if(d1 < d2) return last1; T current1 = first1; T current2 = first2; while(current2 != last2) { if(*curren

(字符串)最长公共字串(Longest-Common-SubString,LCS)

题目: 给定两个字符串X,Y,求二者最长的公共子串,例如X=[aaaba],Y=[abaa].二者的最长公共子串为[aba],长度为3. 子序列是不要求连续的,字串必须是连续的. 思路: 1.简单思想: 遍历两个字符串X.Y,分别比较X的字串与Y的字串,求出最长的公共字串. #include <iostream> #include <vector> using namespace std; int getComLen(char *str1,char *str2){ int len=

字符串中最长的不重合字串长度

例子 "abmadsefadd"  最长长度为5 "avoaid"           最长长度为3 思路 空间换时间hashTable,标准下其实位置beg.初始化全局最大值0.开辟字符数组,起初标为0. 访问数组时 如果该字符在hashTable对应的哈希值为1,则计算当前位置到beg的距离,并且把beg赋值为当前位置.如果大于全局最大值,则替换全局最大值 如果该字符在hashTable对应的哈希值为0,则置1 参考代码 #include <iostrea

九度1535 重叠的最长字串 字符串哈希

题目描述: 给定两个字符串,求它们前后重叠的最长子串的长度,比如"abcde"和"cdefg"是"cde",长度为3. 输入: 输入可能包含多个测试案例. 对于每个测试案例只有一行, 包含两个字符串.字符串长度不超过1000000,仅包含字符'a'-'z'. 输出: 对应每个测试案例,输出它们前后重叠的最长子串的长度. 样例输入: abcde cdefg 样例输出: 3 #include <iostream> #include <

leetcode Longest Common Prefix 多个字符串的最长字串

1 public class Solution { 2 public String get(String a,String b) 3 { 4 5 if(a==""||b=="") return ""; 6 int len1=a.length(); 7 int len2=b.length(); 8 int len=len1; 9 if(len>=len2) len=len2; 10 String s=""; 11 for(

搜索里的相似度计算-最长公共字串

相似度计算的任务是根据两段输入文本的相似度返回从0到1之间的相似度值:完全不相似,则返回0,:完全相同,返回1.衡量两端文字距离的常用方法有:海明距离(Hamming distance),编辑距离,欧氏距离,文档向量的夹角余弦距离,最长公共字串. 1. 余弦相似度 把两篇文档看作是词的向量,如果x,y为两篇文档的向量,则:Cos(x, y) = (x * y) / (||x|| * ||y||) 使用Hashmap可以很方便的把这个计算出来 2. 最长公共字串(Longest Common Su