题目
假设两个字符串中所含有的字符和个数都相同我们就叫这两个字符串匹配,比如:abcda和adabc,由于出现的字符个数都是相同,只是顺序不同,所以这两个字符串是匹配的。要求高效。
思路
假定字符串中都是ASCII字符。用一个数组来计数,前者加,后者减,全部为0则匹配。
代码
<code class=" hljs cpp" style="box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; padding: 0.5em; color: rgb(0, 0, 0); border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; display: block; background-color: transparent !important;"><span class="hljs-comment" style="box-sizing: border-box; color: rgb(136, 136, 136);">/*--------------------------------------------- * 日期:2015-02-14 * 作者:SJF0115 * 题目: 字符串匹配 * 来源:腾讯 * 博客: -----------------------------------------------*/</span> <span class="hljs-preprocessor" style="box-sizing: border-box; color: rgb(136, 0, 0);">#include <iostream></span> <span class="hljs-preprocessor" style="box-sizing: border-box; color: rgb(136, 0, 0);">#include <cstring></span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">using</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">namespace</span> <span class="hljs-built_in" style="box-sizing: border-box; font-weight: bold;">std</span>; <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">class</span> Solution { <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">public</span>: <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">bool</span> StrMatch(<span class="hljs-built_in" style="box-sizing: border-box; font-weight: bold;">string</span> str1,<span class="hljs-built_in" style="box-sizing: border-box; font-weight: bold;">string</span> str2){ <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> size1 = str1.size(); <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> size2 = str2.size(); <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">if</span>(size1 <= <span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">0</span> || size2 <= <span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">0</span> || size1 != size2){ <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">return</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">false</span>; }<span class="hljs-comment" style="box-sizing: border-box; color: rgb(136, 136, 136);">//if</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> count[<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">256</span>]; <span class="hljs-comment" style="box-sizing: border-box; color: rgb(136, 136, 136);">// 初始化</span> <span class="hljs-built_in" style="box-sizing: border-box; font-weight: bold;">memset</span>(count,<span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">0</span>,<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">sizeof</span>(count)); <span class="hljs-comment" style="box-sizing: border-box; color: rgb(136, 136, 136);">// 前者加</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">for</span>(<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> i = <span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">0</span>;i < size1;++i){ ++count[str1[i]]; }<span class="hljs-comment" style="box-sizing: border-box; color: rgb(136, 136, 136);">//for</span> <span class="hljs-comment" style="box-sizing: border-box; color: rgb(136, 136, 136);">//后者减</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">for</span>(<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> i = <span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">0</span>;i < size2;++i){ --count[str2[i]]; }<span class="hljs-comment" style="box-sizing: border-box; color: rgb(136, 136, 136);">//for</span> <span class="hljs-comment" style="box-sizing: border-box; color: rgb(136, 136, 136);">// 全部为0则匹配</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">for</span>(<span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> i = <span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">0</span>;i < <span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">256</span>;++i){ <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">if</span>(count[i] != <span class="hljs-number" style="box-sizing: border-box; color: rgb(0, 136, 0);">0</span>){ <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">return</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">false</span>; }<span class="hljs-comment" style="box-sizing: border-box; color: rgb(136, 136, 136);">//if</span> }<span class="hljs-comment" style="box-sizing: border-box; color: rgb(136, 136, 136);">//for</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">return</span> <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">true</span>; } }; <span class="hljs-keyword" style="box-sizing: border-box; font-weight: bold;">int</span> main() { Solution solution; <span class="hljs-built_in" style="box-sizing: border-box; font-weight: bold;">string</span> str1(<span class="hljs-string" style="box-sizing: border-box; color: rgb(136, 0, 0);">"afafafa"</span>); <span class="hljs-built_in" style="box-sizing: border-box; font-weight: bold;">string</span> str2(<span class="hljs-string" style="box-sizing: border-box; color: rgb(136, 0, 0);">"afafaf"</span>); <span class="hljs-built_in" style="box-sizing: border-box; font-weight: bold;">cout</span><<solution.StrMatch(str1,str2)<<endl; }</code>