Rearrange a string so that all same characters become d distance away

本文介绍了一种基于贪心策略的字符串重排算法,用于解决给定字符串中相同字符至少相隔d距离的问题,并探讨了两种实现方案:使用最大堆或排序进行字符频率排序,以及利用vector<list<char>>记录不同频率的字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a string and a positive integer d. Some characters may be repeated in the given string. Rearrange characters of the given string such that the same characters become d distance away from each other. Note that there can be many possible rearrangements, the output should be one of the possible rearrangements. If no such arrangement is possible, that should also be reported.
Expected time complexity is O(n) where n is length of input string.

Examples:
Input:  "abb", d = 2
Output: "bab"

Input:  "aacbbc", d = 3
Output: "abcabc"

Input: "geeksforgeeks", d = 3
Output: egkegkesfesor

Input:  "aaa",  d = 2
Output: Cannot be rearranged
摘自:http://www.geeksforgeeks.org/rearrange-a-string-so-that-all-same-characters-become-at-least-d-distance-away/

这题就是贪心算法。对于字符串处理来讲,如果不care最终的符号序,就要以考虑用统计重排的方法。

1. 统计所有字符的出现频率;

2. 按出现频率从高到低优先填好所有字符;

如果全部都是ASCII码,共出现m个不同字符,第2步,可以:

1. 用最大堆来做,也可以直接排序,时间复杂度都是O(n+mlgm),空间复杂度就是O(m)。因为m<256<<n,所以最终复杂度也可以说是O(n)。

2. 也可以直接用一个vector<list<char> >记录每个频率下的字符来做。用vector<list<char> >就是O(2n)的时间复杂度了。空间复杂度高点,O(n)。

 

转载于:https://www.cnblogs.com/linyx/p/4083424.html

<think>嗯,用户的问题是关于NULL的重新排列,但不太清楚具体想要做什么。首先,我需要仔细阅读用户提供的引用内容,特别是关于NULL的定义和本质。根据引用[1],NULL在C语言中本质是0,但作为内存地址0x00000000,这可能指向零地址,而在C++中定义为0。引用[2]提到在gcc下出现段错误,这可能是因为访问了NULL指针指向的内存,而零地址通常不可访问。 用户可能遇到了使用NULL时的问题,比如程序崩溃,想了解如何正确使用或重新定义NULL。需要解释NULL的不同定义在C和C++中的区别,以及为什么解引用NULL指针会导致段错误。同时,用户可能希望了解如何安全地处理NULL,比如检查指针是否为空,避免解引用空指针,或者自定义NULL的定义。需要结合代码示例说明正确和错误的用法,并生成相关问题帮助用户深入理解。</think>### NULL的理解使用注意事项 #### 1. NULL的本质 在C语言中,NULL的定义为$((void *)0)$,表示指向内存地址0的指针。这个地址通常不可访问,因此解引用NULL指针会导致段错误(如引用[2]中提到的gcc下段错误)[^1][^2]。例如: ```c int *p = NULL; printf("%d", *p); // 此处会触发段错误 ``` 在C++中,NULL被定义为整数0,例如: ```cpp int *p = NULL; if (p == 0) { ... } // 合法比较 ``` #### 2. 安全使用NULL的建议 - **初始化指针**:未初始化的指针可能指向随机地址,建议初始化为NULL: ```c int *p = NULL; // 明确表示p当前不指向有效内存 ``` - **检查指针有效性**:在解引用指针前必须检查: ```c if (p != NULL) { *p = 10; // 安全操作 } ``` - **避免强制转换**:C语言中不需要显式转换,但C++需要: ```cpp int *p = nullptr; // C++11起推荐使用nullptr ``` #### 3. 自定义NULL的注意事项 若需修改NULL的定义(如引用[2]中的代码),需注意: ```c #undef NULL #ifdef __cplusplus #define NULL 0 // C++环境 #else #define NULL ((void *)0) // C环境 #endif ``` 此定义确保了类型安全,但直接操作NULL指针仍可能导致未定义行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值