Data.String: performance: use sort() instead of use loop

現状の実装だと、最悪ケースでリスト長分ループするので遅いです。
このため、はじめにリストをsortし、最初と最後の要素で共通部分を探すようにしました。
無駄にsortのコストがかからないようにリスト長が2個より大きい場合にだけsortするようにしてます。