プラン(パイソン)---文字列クラスを受賞

スペースを置き換えます01-

文字列にスペースを置き換える、機能を実装してください「20%。」例えば、文字列があるとき、私たちは幸せです。文字列が後に我々%20Are%20Happy交換後。

1を考える:Pythonは(代替案を置き換えるために)置き換え、機能を置き換える直接来ます

class Solution:     # s 源字符串
    def replaceSpace(self, s):
        s = s.replace(' ','%20')
        return s
    
if __name__=='__main__':
    s = Solution()
    print(s.replaceSpace('We Are Happy'))

方法2:スペースの長さは「20%」の長さに置き換えられた文字列の長さが長くなり、3です。あなたは私たちがスペースの代わりに文字列を格納するための新しい配列を開くできるようにする場合は、
そうこの質問は非常に簡単です。設定された2つのポインタは、あなたが新しい文字列の「%20」に記入するスペースが発生した場合、元の文字列を横断し、古いものと新しい要素の最初の文字列を指す
そうでない場合は、メタ文字列の内容をコピーします。しかし、インタビュアーの文字列操作の元であれば、店舗の置換文字列に元の文字列の長十分なスペースことを確実にするために、

だから我々は、他の方法を考える必要があります。まず、文字列を見つけるために、元の文字列の長さと内スペースの数を越える
我々は最後の新しい文字列の長さを見つけることができる数とスペースの元の文字列の長さに依存。
元の文字列と新しい文字列の最後のポイント1のポイント2と場所への2つのポインタのポイントを提供します。
(なぜここで終わりを横断取る、というよりもPOINT1を利用するために、開始トラバースを取りますポイント2この判定条件)
コンテンツがPOINT1ポイントブランクでない場合、コンテンツは、位置ポイント2ポイントに割り当てられる、
空間POINT1ポイント場合、開始ポイント2から次に割り当て「02%」POINT1まで
すべてのスペース文字が完成置き換えられているポイント2ショー。
オリジナルます。https://blog.csdn.net/Yeoman92/article/details/77865878

class Solution:
    def replaceSpace(self, oldString):
        blankNumber = 0#空格的数量
        oldStringLen = len(oldString)#原字符串的长度

        #遍历原字符串,找出字符串的空格数量
        for i in range(oldStringLen):
            if oldString[i] == ' ':
                blankNumber += 1

        #计算新字符串的长度
        newStringLen = oldStringLen + blankNumber * 2
        #声明新字符串列表(因为字符串是不可改变的)
        newStringList = [' '] * newStringLen

        #设置两个指针,分别指向那个原字符串和新字符串的末尾位置
        point1 = oldStringLen - 1
        point2 = newStringLen - 1

        #遍历替换
        while point1 != point2:#如果两个指针位置不同,则表明没有替换完成
            if oldString[point1] != ' ':#字符不为空
                newStringList[point2] = oldString[point1]
                point1 -= 1
                point2 -= 1
            else:
                newStringList[point2] = '0'
                newStringList[point2-1] = '2'
                newStringList[point2-2] = '%'
                point1 -= 1
                point2 -= 3

        #把指针恰好相同时,之前的字符也补上
        if point1 > 0:
            for i in range(point1,-1,-1):
                newStringList[i] = oldString[i]

        #把字符串数组组合为字符串
        newString = ''
        for i in range(newStringLen):
            newString += str(newStringList[i])

        return newString

#测试用例
s = Solution()
print(s.replaceSpace('We Are Happy'))

02-正規表現の一致

タイトル説明が
備えるに「と一致する機能を実装」と「」正規表現インチ モード文字「」いずれかの文字が『は(0時間を含む)任意の回数とすることができる』文字の前に示されています。この問題では、試合全体のパターンが文字列のすべての文字に一致しています。たとえば、文字列「AAA」モードと「AA」と「AB&AC A」試合が、「aa.a」と「abが*」と一致しません

条件に一致する状態に直接の1-アイデア
この問題をもたらしたが、タイトルの意味を慎重に検討が明確であり、とにかく、私は理解する前に何度も試してみましたが必要です。
まず、特別な事情を考慮してください:
1> 2つの文字列がtrueに戻って、空になっている
最初の文字列が空でない場合> 2は、第二の文字列が空で、リターン偽(それができないため、
成功を一致させます、最初の文字列が空であれば、第二の非空の文字列、またはに一致させることができる
ような2番目の文字列のような作業は、「aはA、A 、A 'から、」要素が0回前に存在することができ、
それが成功を一致させることができる)
、その後、最初の文字を一致させるようになった、2つの可能性があります成功したマッチまたはマッチは失敗します。しかし、パターンを考慮
次の文字が「かもしれ
」ここでは2例について説明します。次のパターンのための文字「」や
ない「と

1>次のパターンが文字ではありません』」:この状況は、比較的簡単です直接現在の文字を一致させます。場合は
マッチが成功すると、次の試合に進み、マッチが失敗した場合、直接はfalseを返します。ことを注意
同じ状況で2つの文字に加えて、どのパターンの状況があり、「マッチングの成功」
に現在の文字が「」、現在の文字がstrのではありませんが『\ 0』。
2>次のパターンが文字「で
」は、少し複雑です「」より0を表現したりすることができます。
ここではこのような状況は考慮されています。
>場合「
」マッチング文字0、STR定電流文字、この後の2つの文字のパターンずれ、
このスキップ「」記号を、
B>「ときに
時間が」1個以上、STR移動現在の文字にマッチします次回、パターン現在の文字
変わりません。一致有する場合:(一つまたは複数のでここで一致し、状況とみなすことができる
。strは次の文字に移動するので、同じ文字パターンは、ケースの上部に戻さ
一致複数の文字、同等の試合は)STRの次の文字を再開し
、書き込みコードは非常に簡単です後。

# -*- coding:utf-8 -*-
class Solution:
    # s, pattern都是字符串
    def match(self, s, pattern):
        # 如果s与pattern都为空,则True
        if len(s) == 0 and len(pattern) == 0:
            return True
        # 如果s不为空,而pattern为空,则False
        elif len(s) != 0 and len(pattern) == 0:
            return False
        # 如果s为空,而pattern不为空,则需要判断
        elif len(s) == 0 and len(pattern) != 0:
            # pattern中的第二个字符为*,则pattern后移两位继续比较
            if len(pattern) > 1 and pattern[1] == '*':
                return self.match(s, pattern[2:])
            else:
                return False
        # s与pattern都不为空的情况
        else:
            # pattern的第二个字符为*的情况
            if len(pattern) > 1 and pattern[1] == '*':
                # s与pattern的第一个元素不同,则s不变,pattern后移两位,相当于pattern前两位当成空
                if s[0] != pattern[0] and pattern[0] != '.':
                    return self.match(s, pattern[2:])
                else:
                    # 如果s[0]与pattern[0]相同,且pattern[1]为*,这个时候有三种情况
                    # pattern后移2个,s不变;相当于把pattern前两位当成空,匹配后面的
                    # pattern后移2个,s后移1个;相当于pattern前两位与s[0]匹配
                    # pattern不变,s后移1个;相当于pattern前两位,与s中的多位进行匹配,因为*可以匹配多位
                    return self.match(s, pattern[2:]) or self.match(s[1:], pattern[2:]) or self.match(s[1:], pattern)
            # pattern第二个字符不为*的情况
            else:
                if s[0] == pattern[0] or pattern[0] == '.':
                    return self.match(s[1:], pattern[1:])
                else:
                    return False

文字列値を表します03-

タイトル説明
(整数および分数を含む)数値文字列かどうかを決定するために使用される機能を実装してください。例えば、文字列"100"、 "5E2"、 " - 123"、 "3.1416" と"-1E-16"を示す値。しかし、 "12E"、 "1a3.14"、 "1.2.3"、 "±5" と"12E + 4.3"ではありません。

直接実験条件1つのアイデアずつの1-

# -*- coding:utf-8 -*-
class Solution:
    # s字符串
    def isNumeric(self, s):
        # write code here
        if s is None or len(s) == 0:
            return False

        # 是否有e
        hasE = False
        # 是否有小数
        isDecimal = False
        # 是否有+-符号
        hasSign = False

        for i in range(len(s)):
            # 如果有e,只能有一个e且不能是最后一个
            if s[i] == "e" or s[i] == "E":
                if hasE or i == len(s) - 1:
                    return False
                hasE = True
            # 小数点不能重复出现或和e共线
            elif s[i] == ".":
                if hasE or isDecimal:
                    return False
                isDecimal = True
            elif s[i] == "-" or s[i] == "+":
                # 重复出现符号时,必须跟在e后面
                if hasSign and s[i - 1] != "e" and s[i - 1] != "E":
                    return False
                # 重复出现符号时,必须跟在e后面
                if not hasSign and i > 0 and s[i - 1] != "e" and s[i - 1] != "E":
                    return False
                hasSign = True
            elif s[i] < "0" or s[i] > "9":
                return False
        return True

04-文字ストリームは、最初の文字を繰り返しません

文字にのみ表示されます初めての文字列を検索するために機能を実装してください。例えば、文字ストリームは最初の2つの文字を読み取ったときに、最初の文字は、唯一の「G」一度起こる「行きます」。最初の6つの文字を読み出すときに最初に一つだけの文字「L」が表示され、文字ストリームから「グーグル」。

思考の1-直接演算機能を数えます

# -*- coding:utf-8 -*-
class Solution:
    # 返回对应char
    def __init__(self):
        self.c=""
    def FirstAppearingOnce(self):
        for s in self.c:
            if self.c.count(s)==1:
                return s
        return "#"
    def Insert(self, char):
        self.c=self.c+(char)

このクラスのメソッドは、最初のパラメータは、自己のインスタンスを呼び出すことができるです。
すべてのインスタンスでの自己クラスのパラメータは、このパラメータの所有権の例は、例として、すべての方法を使用することができるパラメータの例です。
とき自己プラスself引数の増加にに関しては、私はあなただけで終わりでは白の自己を取得考えるとき、どのような役割、この問題が明らかに言うことはありません。

文字列の配列*

説明タイトルの
入力は、文字列内のすべての文字を印刷するための文字列を辞書式順序で配置されています。例えば、入力文字列abcの場合は、ABCのすべての文字列、B、Cが出て配置することができ、ACB、BAC、BCA、CABおよびCBAを印刷します。

入力説明:
以下9(おそらく繰り返し文字)の文字列を入力し、文字は小文字のみが含まれます。

トピック分析:

  1. 文字列は0とすることができない以上、9ながらストリングの長さ、すなわち、LEN(文字列)<= 9

1を考える:
2、全体の配置は二段階で分解に必要な文字列です:
最初のステップは、最初の文字位置が背後にあるすべての文字との交流のための最初の位置であるかを決定することです。
同じ処理を施し、すべての最初の文字位置の背後の位置に加えて、第二の工程と、文字、印刷まであと、
特定のアルゴリズムは、以下のプロセス
ここに画像を挿入説明
S [0]は、0の位置に固定されている[1、N-図1】位置は、全行(再帰的に)
S [1]には、位置0(S [1]、S [0]交換)、デジタル[1、N-1]の位置全体の行(再帰的)に固定され
... ...
前のi番目の数表示された場合は、スキップ
......
Sに置かを[N-1] 1 [、位置0(S [N-1]、S [0]交換)に固定され、N-1であります】フルフラッシュ位置番号(再帰的に)

ここに画像を挿入説明
場合だけ一文字再帰的サイクルであり、出口再帰は、第2の文字列は、順次のサブのそれぞれの最初の文字に切り替え、その後、重複がある場合、サブストリングの処理を続け、その結果れますセットして再使用

# -*- coding:utf-8 -*-
class Solution:
    def Permutation(self, ss):
        if not ss:
            return []
        res = []
        self.helper(ss, res, '')
        return sorted(list(set(res)))

    def helper(self, ss, res, path):
        if not ss:
            res.append(path)
        else:
            for i in range(len(ss)):
                self.helper(ss[:i] + ss[i+1:], res, path + ss[i])

原文:https://blog.csdn.net/fuxuemingzhu/article/details/79513101 

def perm(s=''):
    if len(s) <= 1:
        return [s]
    sl = []
    for i in range(len(s)):
        for j in perm(s[0:i] + s[i + 1:]):
            sl.append(s[i] + j)
    return sl


def main():
    # 可能包含重复的串
    perm_nums = perm('abb')
    # 对结果去重
    no_repeat_nums = list(set(perm_nums))
    print('perm_nums', len(perm_nums), perm_nums)
    print('no_repeat_nums', len(no_repeat_nums), no_repeat_nums)
    pass


if __name__ == '__main__':
    main()

原文:https://blog.csdn.net/sty945/article/details/79839567 

左回転文字列

説明タイトルの
アセンブラ言語は、左循環シフト命令(ROL)と呼ばれているがあり、今簡単な作業は、命令の演算結果の文字列をシミュレートすることです。指定された文字列Sの場合、あなたはKビットのシリアル出力した後、その左の円を入れました。例えば、文字列S =「abcXYZdef」は、三つ、即ち「XYZdefabc」後に必要な出力結果を左回転させました。それは単純ではないですか?OK、それを得ます!

思考:
思考:
Stringなどの、他の文字列の別の部分として、左利きの文字列の一部として必要になることができる「ABCDEF」、文字列「AB」ことには、2つの左出力ニーズの一環として、二つの文字列が続く「FEDC」は、一緒に「bafedc」を借りる取得し、最終的には全体の文字列「CDEF」、文字列「CDEF」第1フリップフロッの別の部分として、「AB」は「BA」を取得し、その後、フリップ第1のフリップフロッ「cdefab」後に得られた結果は、元の文字列L 2であることを起こります

# -*- coding:utf-8 -*-
class Solution:
    def LeftRotateString(self, s, n):
        ans = []
        if s :
            lists=list(s)#字符串转换为列表
            ans = lists[n:]
            ans.extend(lists[0:n])  #前闭后开
        return ''.join(ans)
公開された58元の記事 ウォン称賛10 ビュー20000 +

おすすめ

転載: blog.csdn.net/qq_24429333/article/details/104533827