尽量多的分割字符串

给定一个只包含小写字母的字符串,我们通过如下规则分割它:

1.一个片段中包含的字符不允许出现在其他片段内。

2.分割的片段数应尽可能的多。

   请实现一个函数,输出分割的片段。

   例如:输入aabbbacceddefgkifk 输出为 aabbba cc edde fgkifk

【1】Vector

        向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。有点类似PHP里面的数组,可以动态向里面添加元素,不需要事先定义长度,而且可以放各种类型,不过要事先声明这个向量容器中放什么类型。

特点:

  • 顺序序列
  • 动态数组
  • 能够感知内存分配器的(Allocator-aware)

定义:Vector<类型>标识符

操作:

void push_back(const T& x):向量尾部增加一个元素X

void pop_back():删除向量中最后一个元素

int size() const:返回向量中元素的个数

 

【2】substr

basic_string::substr(C++切割字符串函数)

basic_string substr(size_type  _Off = 0,size_type _Count = npos) const;

参数

  • 【_Off】所需的子字符串的起始位置。字符串中第一个字符的索引为 0,默认值为0。
  • 【_Count】复制的字符数目
  • 【返回值】一个子字符串,从其指定的位置开始

【3】Code

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;

/**
	例如aabbbabcc
		lastWord存放  c=>8 a=>5 b=>6 
*/
void SplitString(string S) {
	int lastWord[26] = {};//用来存放 最后26个一个字母的位置 
	int i = 0;
	int Slen = S.size();//切割的字符串长度 
	for( i=Slen - 1; i>=0 ; --i) {
		if(lastWord[S[i] - 'a'] == 0 ) {//如果 没有存放
			lastWord[S[i] - 'a'] = i;//赋值最后的位置 进去 
		}
	}
	vector<int> v;//用来存放 要截断的 下标位置 
	i = 0;
	while(i < Slen) {
		int j = i;
		int max_last = lastWord[S[i] - 'a'];//最后字母的位置 比如a最后是5
		while(j <= max_last) {
            //每一次计算,当前的字母的最大长度,例如 b的最大长度是6 
			max_last = max(max_last, lastWord[S[j++] - 'a']);
		} //那么最后就找到最大的长度是6 的子串
		v.push_back(j);//压入一个元素
		i = j ; 
	 
	} 

	int number = 0;
	for(i=0; i<v.size(); i++) {
		cout<< S.substr(number,v[i]-number) << endl;//直接切割 
		number = v[i]; 
			
	}
	
}

int main() {
	string s = "aabbbacceddefgkifk";
	SplitString(s);
	return 0;
}
 

 

<think>我们正在讨论使用正则表达式在Python中分割字符串的方法。根据引用[1]和引用[3],我们可以使用Python的re模块中的split()函数来实现。同时,引用[2]虽然是用Java的例子,但正则表达式的模式是类似的,我们可以借鉴其正则表达式的写法。 在Python中,re.split()函数的基本语法是: ```python import re result = re.split(pattern, string, maxsplit=0, flags=0) ``` 参数说明: - pattern: 正则表达式模式,用于指定分隔符。 - string: 要分割字符串。 - maxsplit: 可选参数,指定最大分割次数,默认为0(表示不限制次数)。 - flags: 可选参数,用于控制正则表达式的匹配方式,如忽略大小写等。 下面我们通过几个示例来说明: 示例1:基本分割(类似引用[1]) ```python import re text = "apple,banana,cherry" split_text = re.split(r',', text) print(split_text) # 输出: ['apple', 'banana', 'cherry'] ``` 示例2:使用个分隔符(比如逗号、分号、空格等) 假设我们有一个字符串,其中包含种分隔符,我们可以使用正则表达式中的字符类([])或选择符(|)来指定个分隔符。 ```python text = "apple, banana; cherry orange" # 使用正则表达式匹配逗号、分号或空格(包括连续空格) split_text = re.split(r'[,\s;]+', text) print(split_text) # 输出: ['apple', 'banana', 'cherry', 'orange'] ``` 注意:上面的正则表达式`[,\s;]+`表示匹配一个或个连续的逗号、空格或分号。这样,即使分隔符之间有个空格,也能正确分割。 示例3:使用分组捕获保留分隔符(如引用[2]中的例子,但注意引用[2]是Java的,我们转成Python) 如果我们希望在分割结果中保留分隔符,可以在正则表达式中使用括号进行分组捕获。这样,分隔符也会作为结果列表的一部分。 ```python text = "Hello\tWorld Java \tProgramming" # 使用正则表达式匹配一个或个空白字符(包括空格和制表符),并使用括号捕获 split_text = re.split(r'(\s+)', text) print(split_text) # 输出: ['Hello', '\t', 'World', ' ', 'Java', ' \t', 'Programming'] ``` 但通常我们不需要保留分隔符,所以如果不使用括号,则不会保留: ```python text = "Hello\tWorld Java \tProgramming" split_text = re.split(r'\s+', text) print(split_text) # 输出: ['Hello', 'World', 'Java', 'Programming'] ``` 示例4:限制分割次数(maxsplit参数) ```python text = "one two three four" split_text = re.split(r'\s+', text, maxsplit=2) print(split_text) # 输出: ['one', 'two', 'three four'] ``` 示例5:处理复杂的分割情况,比如分割数字和字母(使用环视断言) ```python text = "123abc456def" # 在数字和字母之间分割,但不想丢失任何部分 split_text = re.split(r'(?<=\d)(?=[a-z])|(?<=[a-z])(?=\d)', text) print(split_text) # 输出: ['123', 'abc', '456', 'def'] ``` 这里使用了正则表达式的环视断言: - `(?<=\d)(?=[a-z])` 表示当前位置前面是数字,后面是字母 - `|` 或者 - `(?<=[a-z])(?=\d)` 表示当前位置前面是字母,后面是数字 这样就在数字和字母的边界处进行了分割。 注意事项: - 如果正则表达式中使用了分组,那么分割结果中会包含分组匹配到的内容。 - 如果不想包含分隔符,就不要用分组。 - 如果分割模式在字符串的开头或结尾匹配,那么结果列表的开头或结尾会包含空字符串。 例如: ```python text = ",apple,banana," split_text = re.split(r',', text) print(split_text) # 输出: ['', 'apple', 'banana', ''] ``` 我们可以使用列表推导式来过滤掉空字符串: ```python split_text = [s for s in re.split(r',', text) if s != ''] print(split_text) # 输出: ['apple', 'banana'] ``` 或者使用正则表达式匹配分隔符时,允许开头和结尾的分隔符被忽略,但这样处理起来比较复杂,所以通常用过滤的方法。 总结:在Python中使用正则表达式分割字符串,主要依靠re.split()函数。根据不同的需求,编写合适的正则表达式,并注意处理分割后可能出现的空字符串。 现在,我们可以根据用户的问题,给出一个完整的示例代码: ```python import re # 示例:使用正则表达式分割字符串 text = input("请输入要分割字符串: ") pattern = input("请输入分割的正则表达式模式: ") # 进行分割 try: result = re.split(pattern, text) print("分割结果:", result) except re.error as e: print("正则表达式有误:", e) ``` 注意:用户输入的正则表达式模式需要是合法的,否则会抛出re.error异常。 §§相关问题§§ 1. 如何在分割字符串时忽略大小写? 2. 正则表达式分割时如何避免产生空字符串? 3. 如何分割包含个连续分隔符的字符串?</think># Python 正则表达式分割字符串详解 在 Python 中,使用正则表达式分割字符串可以通过 `re.split()` 方法实现,它提供了比普通 `split()` 更强大的模式匹配能力。下面我将详细介绍各种使用场景和技巧。 ## 基本用法 ```python import re # 基本分割 text = "apple,banana,cherry" result = re.split(r',', text) print(result) # 输出: ['apple', 'banana', 'cherry'] [^1] ``` ## 分隔符分割 ```python # 使用个分隔符(逗号、分号、空格) text = "apple, banana; cherry orange" result = re.split(r'[,\s;]+', text) # \s 匹配任意空白字符 print(result) # 输出: ['apple', 'banana', 'cherry', 'orange'] # 使用 | 指定个分隔符 text = "apple|banana:cherry/orange" result = re.split(r'[|:/]', text) print(result) # 输出: ['apple', 'banana', 'cherry', 'orange'] ``` ## 保留分隔符 ```python # 使用捕获分组保留分隔符 text = "3+5*2-8/4" result = re.split(r'([+\-*/])', text) # 注意转义 - print(result) # 输出: ['3', '+', '5', '*', '2', '-', '8', '/', '4'] [^2] ``` ## 限制分割次数 ```python # 限制分割次数 text = "one,two,three,four" result = re.split(r',', text, maxsplit=2) print(result) # 输出: ['one', 'two', 'three,four'] ``` ## 处理复杂模式 ```python # 分割数字和字母 text = "123abc456def789" result = re.split(r'(?<=\d)(?=[a-z])|(?<=[a-z])(?=\d)', text) print(result) # 输出: ['123', 'abc', '456', 'def', '789'] # 分割带前缀的字符串(如引用[3]) text = "@@扎克伯格@俞敏洪" result = re.split(r'@+', text) result = [name for name in result if name] # 过滤空字符串 print(result) # 输出: ['扎克伯格', '俞敏洪'] [^3] ``` ## 处理空字符串 ```python # 避免空字符串结果 text = ",apple,,banana,cherry,," result = re.split(r',', text) print(result) # 输出: ['', 'apple', '', 'banana', 'cherry', '', ''] # 过滤空字符串 result = [item for item in result if item] print(result) # 输出: ['apple', 'banana', 'cherry'] # 或者直接使用正则匹配非空部分 result = re.findall(r'[^,\s;]+', text) # 匹配非分隔符的连续字符 print(result) # 输出: ['apple', 'banana', 'cherry'] ``` ## 高级技巧:使用环视断言 ```python # 在数字和字母之间分割,但不消耗字符 text = "123abc456def" result = re.split(r'(?<=\d)(?=[a-z])|(?<=[a-z])(?=\d)', text) print(result) # 输出: ['123', 'abc', '456', 'def'] # 分割句子但保留标点 text = "Hello! How are you? I'm fine." result = re.split(r'(?<=[.!?])\s+', text) print(result) # 输出: ['Hello!', 'How are you?', "I'm fine."] ``` ## 性能考虑 对于大型数据集: 1. 预编译正则表达式可提高性能 2. 尽量使用简单模式 3. 考虑使用生成器处理流数据 ```python # 预编译正则表达式 pattern = re.compile(r'[,\s;]+') # 处理大文件 with open('large_data.txt') as f: for line in f: fields = pattern.split(line.strip()) # 处理每个字段 ``` 正则表达式分割特别适合处理不规则分隔符或需要复杂模式匹配的场景。对于简单分隔符,内置的 `split()` 方法通常更高效[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值