给定一个字符串s和一个由多个等长字符串组成的列表words,输出列表中的字符串组成的整体在s中的所有可能的位置

示例:

输入:s = "abcmmedfrgaqwedfrmme"   words=["mme","dfr"]

输出:[3,14]

Python解决方案:

class Solution(object):
    def findSubstring(self, s, words):
        """
        :type s: str
        :type words: List[str]
        :rtype: List[int]
        """
        if not words:
            return []
        w_len = len(words[0])
        all_len = w_len*len(words)

        out = []
        word_count = collections.Counter(words)

        for i in range(len(s)-all_len+1):
            sub_i = s[i:i+w_len]
            if sub_i in word_count:
                j = i + w_len
                wc = word_count.copy()
                wc[sub_i] -= 1
                while j <= all_len + i-w_len:
                    sub = s[j:j+w_len]
                    if sub in wc and wc[sub]:
                        wc[sub] -= 1
                        j += w_len
                        pre = sub
                    else:
                        break
                if not sum(wc.values()):
                    out.append(i)
        return out

原文地址:https://www.cnblogs.com/wenqinchao/p/10688959.html

时间: 2024-10-08 01:22:24

给定一个字符串s和一个由多个等长字符串组成的列表words,输出列表中的字符串组成的整体在s中的所有可能的位置的相关文章

字典序,求给定字符串的下一个

POJ 1146 ID Codes 给定字符串有26个小写字母组成,求出给定字符串的下一个. 算法简述: 对于字符数组chararray,从字符串末尾向前找到第一个chararray[index]<chararray[index-1],然后找到index之后的字符中最后一个大于chararray[index-1],记为position,小于chararray[index]的字符.然后交换chararray[index-1]和chararray[position].对index及其以后的字符从小到

给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 print-all-combinations-of-given-length

// 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 /* Input: set[] = {'a', 'b'}, k = 3 Output: aaa aab aba abb baa bab bba bbb Input: set[] = {'a', 'b', 'c', 'd'}, k = 1 Output: a b c d package recursion; import java.util.ArrayList; public class N_sets_form

一道有趣的算法题:仿照Excel的列编号,给定一个数字,输出该列编号字符串

       By Long Luo 最近遇到一个算法题: 仿照Excel的列编号,给出一个数字,输出该列编号字符串. 例如:A对应1,Z对应26,AA对应27,AZ对应52 ...... 这个题目是一个典型的26进制思路去处理,但是这个题目里面有很多陷阱,在1, 26, 52等特殊情况进行考虑,经过晚上接近1个小时的编写,完成的代码如下: C++代码如下: #include <iostream> #include <string.h> using namespace std; /

JavaScript算法----给定一个长度为N的串,求最长回文子串。

/* *给定一个长度为N的串,求最长回文子串. */ function returnStr(str){ console.log(str); var arr = [],s = ""; for(var i=0;i<str.length;i++){ s = ""; if(str.charAt(i)==str.charAt(i+1)){ var j=0; while(str.charAt(i+j+1)==str.charAt(i-j)){ s = str.charAt

C语言 判断一个字符串是不是另一个旋转任意位所得

/************************************************************************************ 4.判断一个字符串是否为另外一个字符串旋转之后的字符串. 例如:给定s1 = AABCD和s2 = BCDAA,返回1, 给定s1=abcd和s2=ACBD,返回0. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA AABCD右旋一个字符得到DAABC AABCD右旋两个字符得到CDAAB ****

Java实现统计某字符串在另一个字符串中出现的次数

面试时会经常考这样的题目,估计也不让使用正则表达式.还好这个算法还算简单,不过在草稿纸上写难免会出现运行异常,好吧,面试官赢了,乃们屌丝就实实在在的把代码码出来吧. 下面是实现代码: /** * 统计某字符串在另一个字符串中出现的次数 * * */ public class CountHit { public static void main(String[] args) { String a = "123456abcde6ab"; String b = "6abc"

cocos2dx中使用的tolua关于字符串处理的一个问题

在使用cocos2dx的tolua binding的过程中发现一个问题,如果返回或者输入是std::string的时候不允许包含二进制数据,而std::string是允许的,这样一来就造成了一个使用上的不对等,可能会造成一系列的问题,特别是我们需要用std::string来传递一些协议信息的时候. 造成问题的原因是tolua生成的代码对于std::string都没有加入length参数,这样就造成了一旦是二进制数据并且遇到\0就会被截断.修改的办法其实也很简单,只需要修改一下basic.lua脚

js获取一个字符串中指定字符串第n次出现的位置

1.JS获取一个字符串中指定字符串第n次出现的位置 了解类似的获取字符位置的方法: 1.1 charAt() 获取字符串指定位置的字符 用法:strObj是字符串对象,index是指定的位置,(位置从0开始数) strObj.charAt(index) 1.2 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置 用法:stringObject是字符串对象,searchvalue是指定的字符串值,fromindex(可有可无)指定开始匹配字符串值的位置,若无,表示从0位置开始

010给定一个循环链表,实现一个算法返回这个环的开始结点 (keep it up)

给定一个循环链表,实现一个算法返回这个环的开始结点. 定义: 循环链表:链表中一个结点的指针指向先前已经出现的结点,导致链表中出现环. 例子: 输入:A -> B -> C -> D -> E -> C [结点C在之前已经出现过] 输出:结点C 可以用一个map<node*,bool> 就解决问题了. 下面是编程之美上一种奇特的解法:快慢指针解法. 代码: struct SNode { int data; SNode* next; }; SNode* findCi

写一个函数,对于一个给定的整数,如果它的二进制模式从正向看和反向看是一样的,那么返回true;

写一个函数,对于一个给定的整数,如果它的二进制模式从正向看和反向看是一样的,那么返回true:也就是实现这样一个函数boolean isPalindrome(int x); 分析一下,该题目主要是通过移位来实现,二进制模式从正向看和反向看是一样的,说明这个二进制数两边是对称的, 画个图看看: 代码如下: boolean isPalindrome(int x){ int flag = 1,i,j,temp;    while(1){        if(num&(0x1<<flag)){