在Python中计算字符串的子字符串

时间:2017-04-14 14:11:50

标签: python

我有一个简单的字符串“abc”。现在我必须编写Python代码来创建所有可能的唯一子串,除了空字符串,从这个字符串。

答案应如下: 一个 b C AB AC 公元前 ABC

我写了这样的话:

def getsubstrings(str):
    sub = []
    length = len(str)
    for i in range(length):
        for j in range(i,length):
            sub.append(str[i:j+1])
    sub.sort()
    return sub

str = "abc"
print (getsubstrings(str))

但这可能是错误的方式,因为它没有给出预期的结果。

有人可以帮我提供有效的解决方案。

提前致谢。

3 个答案:

答案 0 :(得分:3)

内置的itertools库(files.get)有一些很棒的功能可以使用。对于不同长度的字符串,您基本上希望获得可能的字母组合。

因此下面的代码示例循环遍历字符串的大小:(1,2,3),获取该特定大小的所有可能组合,以及"链",或者附加它们。 itertools中的函数使用迭代器,这意味着最终答案不会存储在内存中,而是在需要值时创建。对于较大的字符串,这将使用更少的RAM。

Exception in thread "main" java.lang.NullPointerException
     at Cafe.setName(Cafe.java:14)
     at CubanCafe.main(CubanCafe.java:16)



import java.util.Scanner;

public class CubanCafe
{

public static void main(String[] args)
{
    String stateName;

    Scanner scan =  new Scanner(System.in);

    System.out.print(" Enter state: ");
    stateName = scan.nextLine();

    Cafe cafeState = new Cafe(stateName);
    cafeState.setName();
    cafeState.setTaxRate();
    System.out.println(cafeState);;
    System.out.println(cafeState.getTaxRate());
  }
}


public class Cafe {
    private String state, name;
    private double taxRate;

    public Cafe(String state){
        state = state.toUpperCase( );   
        name = null;
        taxRate = 0;

    }

    public void setName(){
        if(state.equals("MD"))
             name = "Parkville Cuban Cafe";
        else if(state.equals("VA"))
             name = "Alexandria Cuban Cafe";
        else 
             name = null;
    }   

    public void setTaxRate(){
        if (state.equals("MD"))
            taxRate = .06;
        else if (state.equals("VA"))
            taxRate = .04;
        else
            taxRate = 0;
    }

    public double getTaxRate(){
        return taxRate;

    }

    public String toString(){
         return (name);
    }

}

答案 1 :(得分:1)

combnations将帮助您实现结果

data= 'abc'
from itertools  import combinations

for num in xrange(1,len(data)+1):
    for i in combinations(data,num):
        print ''.join(i)

a
b
c
ab
ac
bc
abc     

答案 2 :(得分:0)

使用itertool combinations创建不同长度的组合。

>>> from itertools import combinations
>>> s = "abc"
>>> result = []
>>> for l in range(1, len(s)+1):
...     for c in combinations(s,l):
...         result.append(c)
... 
>>> print result
[('a',), ('b',), ('c',), ('a', 'b'), ('a', 'c'), ('b', 'c'), ('a', 'b', 'c')]

您可以稍后更改结果的格式,例如:

>>> result = [''.join(r) for r in result]
>>> print result
['a', 'b', 'c', 'ab', 'ac', 'bc', 'abc']